为什么skimage.imread()不返回我的bmp的RGB值?
我正在尝试从一张bmp格式的图片中切割出一些小块,用于图像相关性分析。不过,当我从skimage.imread()返回的数组中提取单个颜色通道时,得到的不是红色通道或绿色通道,而是一些奇怪的颜色,感觉像是原始数据是以hsl格式存储的。
我试过用PIL把图片转换成RGB格式,但颜色反而变得更糟糕了……
有没有人能告诉我这是怎么回事?
我知道我的问题可能需要更多信息,如果需要我补充什么,请告诉我,谢谢!
编辑:
from skimage import data
full=data.imread("Cam_1.bmp")
green_template = full[144:194,297:347,1] #Both give me a sort of reddish square
red_template = full[145:195,252:302,0]
顺便说一下,如果skimage.match_template可以处理彩色图片的话,我就不会遇到这个问题了……有没有什么相关库可以处理彩色的?
这是我正在处理的图片:
这是我用上面的代码显示的小块结果:
另外,使用full = numpy.array(image)
在用PIL打开后也得到了相同的结果。
1 个回答
1
好的,我搞明白了(在朋友的帮助下)。
我不太明白为什么我的图片显示得那么奇怪,但我知道为什么它们没有显示成红色和绿色的平面。
green_template = full[144:194,297:347,1]
red_template = full[145:195,252:302,0]
这些只是从最终的子数组中取了一部分,分别是绿色和红色的值。如果我想正确显示它们,我应该创建一张新图片,把绿色模板和红色模板作为对应的绿色和红色值,其他地方填零,比如把它变回一个形状为(宽度,高度,3)的数组。
举个例子:
import Image
import numpy as np
im = Image.open('Cam_1.bmp')
#im.show()
r,g,b = im.split()
y = Image.fromarray(np.zeros(im.size[0]*im.size[1]).reshape(im.size[1],im.size[0]).astype('float')).convert("L")
red = Image.merge("RGB",(r,y,y))
green = Image.merge("RGB",(y,g,y))
如果我对原始图片这样做,结果会是这样的图片:
不过,我最开始的问题是,skimage的match_template只接受二维数组。所以,实际上我一直都有正确的数组,只是没意识到它们是对的,因为显示出来的结果让人觉得颜色很奇怪。如果有人知道为什么python在显示二维图像时会出现奇怪的情况,我很想知道。否则,我的问题已经解决了。感谢所有尝试帮助我的人,无论是发帖还是自己尝试的!
编辑 - 应要求提供的图像渲染代码:
def locate_squares(im):
r,g,b = im.split()
red = np.array(r)
green = np.array(g)
green_template = green[144:194,297:347] #,144:194]
gRadius = (green_template.shape[0]/2, green_template.shape[1]/2)
red_template = red[145:195,252:302] #,145:195]
rRadius = (red_template.shape[0]/2, red_template.shape[1]/2)
#print red_template
plt.figure(1)
plt.subplot(1,2,1)
plt.imshow(green_template)
plt.subplot(1,2,2)
plt.imshow(red_template)
plt.figure(2)
plt.subplot(1,2,1)
plt.imshow(green)
plt.subplot(1,2,2)
plt.imshow(red)
plt.show()