为什么skimage.imread()不返回我的bmp的RGB值?

1 投票
1 回答
3497 浏览
提问于 2025-04-18 04:49

我正在尝试从一张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可以处理彩色图片的话,我就不会遇到这个问题了……有没有什么相关库可以处理彩色的?

这是我正在处理的图片:enter image description here

这是我用上面的代码显示的小块结果:enter image description here

另外,使用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))

如果我对原始图片这样做,结果会是这样的图片:

enter image description here

不过,我最开始的问题是,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()

撰写回答