简体   繁体   English

如何在图像之间传输像素颜色和位置

[英]How to transfer pixel color and location between images

I am trying to take the points in this image: 我试图在这张图片中取点:

data.png data.png

and transfer them to this US map outline: 并将它们转移到美国地图轮廓:

us_outline.png us_outline.png

but I am struggling with it. 但我正在努力。

I am trying to use a method in which I read the color and coordinate location of the non-green pixels from 'data.png', store them in a list, and them place those pixels onto 'us_outline.png' based of off their location. 我试图使用一种方法,我从'data.png'中读取非绿色像素的颜色和坐标位置,将它们存储在列表中,然后根据它们将这些像素放在'us_outline.png'上位置。

Here is the code I have so far: 这是我到目前为止的代码:

#IMPORTS
from __future__ import division
import math
import numpy as np
from PIL import Image
import matplotlib.pyplot as mplot

#List of pixels from data.png
pixels = []

height = 140
width = 200

#Read in data from data.png
data = Image.open( "data.png" )
data = data.convert('RGB')

for row in range(0,height): #loops over the number of rows in the image
    for col in range(0,width): # loops over the number of columns in the current row
        r,g,b = data.getpixel((row,col))
        rgb = []
        rgb.append(r)
        rgb.append(g)
        rgb.append(b)
        if rgb != [0,255,0]:
            pixels.append(rgb)

But doing so results in an error: IndexError: image index out of range 但这样做会导致错误:IndexError:图像索引超出范围

I have also tried this: 我也试过这个:

#Convert to float32 format
data_image = np.float32(data)

#Reads in data points from data.png and appends them to a list
for row in range(len(data_image)): #loops over the number of rows in the image
    for col in range(len(data_image[row])): # loops over the number of columns in the current row
        pixel = data_image[row][col] #Assigns pixel at row and column to a variable
        if pixel != [0,255,0,255]: #If pixel is not green (a.k.a it is a data point)
            pixels.append(pixel) #Set key to the location of pixel and set value to pixel color

#Read in data from us_outline.png     
img2 = Image.open( "us_outline.png" )
usmap = img2.load()
#Convert to float32 format
usmap_image = np.float32(usmap)

#Writes data from pixels list to US map
for row in range(len(usmap_image)): #loops over the number of rows in the image
    for col in range(len(usmap_image[row])): # loops over the number of columns in the current row 
        for pixel in range(len(pixels)):
            if pixels[row][col] == usmap_image[row][col]:
                usmap_image[row][col] = pixels[row][col]

usmap_image = np.uint8( usmap_image ) 

but doing so results in errors in lines 21 and 22 但这样做会导致第21和22行出错

I have also tried simply adding the two images together, but that yielded a weird result. 我也试过简单地将两个图像一起添加,但这产生了一个奇怪的结果。

I have tried many methods and I can't figure out how to get it to work. 我尝试了很多方法,我无法弄清楚如何让它工作。 Please help! 请帮忙!

Thanks in advance 提前致谢

In your first piece of code, you just need to swap row and col to read in the pixels correctly. 在第一段代码中,您只需要交换rowcol来正确读取像素。 Line 18 becomes 第18行变为

r,g,b = data.getpixel((col, row))

Otherwise, the following piece of code accomplishes your goal and is a bit more succinct: 否则,以下代码完成了您的目标,并且更简洁:

import numpy as np
import matplotlib.pyplot as plt

# find indices of non-green pixels
data = plt.imread('data.png')
green = np.zeros_like(data)
green[:,:,1] = 1. # plt.imread for some bizarre reason returns rgb values between 0.-1. for the given pngs, not 0-255!
x, y = np.where(np.any(data != green, axis=-1))

# plot non-green pixels on us outline
us = plt.imread('us_outline.png')
us[x,y] = data[x,y]

plt.imshow(us)
plt.show()

在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM