为啥 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 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不为其创建专用网站的情况下为我的应用提供隐私政策?

为啥我的新 PostgreSQL 数据库不为空?

为啥没有结果时 ResultSet 不为空? [复制]

如何修复 Discord.py 不为语音命令运行我的异步功能?

为啥不为不同用户的设备使用相同的 cookie?

为啥 Babel 不为 IE11 提供 URLSearchParams polyfill