为啥 skimage.imread() 不为我的 bmp 返回 RGB 值?
Posted
技术标签:
【中文标题】为啥 skimage.imread() 不为我的 bmp 返回 RGB 值?【英文标题】:Why does skimage.imread() not return RGB values for my bmp?为什么 skimage.imread() 不为我的 bmp 返回 RGB 值? 【发布时间】:2014-04-30 01:20:09 【问题描述】:我正在尝试从 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]
FWIW,如果 skimage.match_template 可以拍摄彩色图像,我就不会遇到这个问题...是否有相关库可以进行颜色处理?
这是我正在使用的图片:
当我显示用上面的代码制作的小作物时,结果如下:
在使用 PIL 打开后使用 full = numpy.array(image)
也会产生相同的结果。
【问题讨论】:
你能提供BMP吗? 这是一个对我来说很好的例子,也许你可以提供你的例子不起作用?import skimage.io skimage.io.imread('http://vaxa.wvnet.edu/vmswww/images/test4.bmp')
(评论编辑器不会让我有多行代码)
你能证明你能分裂成不同的位面吗?我尝试了那个特定的模块,但它仍然不适合我。
【参考方案1】:
好的,我想通了(在朋友的帮助下)。
我不完全明白为什么我的图片显示得如此奇怪,但我知道为什么它们没有显示为红色和绿色的平面。
green_template = full[144:194,297:347,1]
red_template = full[145:195,252:302,0]
这些从最终的子数组中取出一个切片,分别是 g 和 r 值。如果我想正确显示它们,我应该做的是创建一个新图像,其中 green_template 和 red_template 作为各自的 g 和 r 值,在其他地方为零,例如使其回到形状为(宽度,高度,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 在显示 2D 图像时会做奇怪的事情,我想知道。否则,我已经解决了我的问题。感谢任何试图提供帮助的人,无论您是发布内容还是自己尝试了一些东西!
编辑 - 请求的图像渲染代码:
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()
【讨论】:
从这里的任何东西来看,你用来将 ndarray 转换为图像的方法并不明显,但是我能想到的所有方法都需要一个 3d 数组(宽度,高度,飞机)。也许如果你展示你用来渲染它的代码会有所帮助。 最佳猜测:假设您将 green_template 传递给需要 3d 数组的东西。由于每个 (x,y) 只有一个值,因此渲染器试图将此值解释为 24 位(或 32 位)颜色。颜色的二进制表示可能会更好地说明问题 - 而不是 24 位值 '010001011001000101111111' (RGB 三元组 [127, 145, 69] 作为单个 24 位数字),您正在传递 '000000000000000010010011' (147 作为 24 位数字);即,具有大量红色和零绿色或蓝色的像素。因此,green_template 的所有像素都呈现为各种深浅不一的红色。 我明白了。是的,这是有道理的。两张图片中肯定有很多红色。以上是关于为啥 skimage.imread() 不为我的 bmp 返回 RGB 值?的主要内容,如果未能解决你的问题,请参考以下文章