【问题标题】:How to transfer pixel color and location between images如何在图像之间传输像素颜色和位置
【发布时间】:2017-04-18 05:35:18
【问题描述】:

我正在尝试获取这张图片中的要点:

data.png

并将它们转移到这个美国地图轮廓:

us_outline.png

但我正在为此苦苦挣扎。

我正在尝试使用一种方法,从“data.png”中读取非绿色像素的颜色和坐标位置,将它们存储在列表中,然后将这些像素放置到“us_outline.png”中离开他们的位置。

这是我目前的代码:

#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)

但是这样做会导致错误:IndexError: image index out of range

我也试过这个:

#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 ) 

但这样做会导致第 21 行和第 22 行出现错误

我也尝试过简单地将两个图像相加,但结果很奇怪。

我尝试了很多方法,但我不知道如何让它发挥作用。请帮忙!

提前致谢

【问题讨论】:

    标签: python image numpy compiler-errors python-imaging-library


    【解决方案1】:

    在您的第一段代码中,您只需交换rowcol 即可正确读取像素。第 18 行变为

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

    否则,以下代码可以实现您的目标并且更简洁:

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2014-11-07
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      相关资源
      最近更新 更多