Python 如何使用matplotlib控制彩色图像渲染?

Python 如何使用matplotlib控制彩色图像渲染?,python,image,colors,matplotlib,Python,Image,Colors,Matplotlib,从rgb图像中,仅通过添加填充有零的边框创建另一个图像: 密度剖面图显示两幅图像上非零域的像素值相同 subplot(141) imshow(rgb_chromosomes[0]) subplot(142) plot(rgb_chromosomes[0][13,:,:]) subplot(143) imshow(resized_rgb[0][10:40,11:40,:]) subplot(144) plot(resized_rgb[0][25,17:38,:]) show() 奇怪的是,调

从rgb图像中,仅通过添加填充有零的边框创建另一个图像:

密度剖面图显示两幅图像上非零域的像素值相同

subplot(141)
imshow(rgb_chromosomes[0])
subplot(142)
plot(rgb_chromosomes[0][13,:,:])
subplot(143)
imshow(resized_rgb[0][10:40,11:40,:])
subplot(144)
plot(resized_rgb[0][25,17:38,:])

show()
奇怪的是,调整大小后的图像看起来是蓝色的,而原来的图像看起来是棕色的。 如何使第二个图像看起来像第一个图像

谢谢

请参阅和

如果在imshow的所有调用中使用相同的
vmin
/
vmax
cmap
,则颜色 应反映完全相同的强度,而不考虑 形象

编辑:在注释后添加示例。我可能误解了问题所在,但代码/图像说明了如何设置v限制以匹配颜色(顶行),或者如果每个图像自动正常化(底行),会发生什么情况

注意:该问题仅在非零颜色范围不包括零时出现。这是用上面的
偏移量
变量显示的。

请参阅和

如果在imshow的所有调用中使用相同的
vmin
/
vmax
cmap
,则颜色 应反映完全相同的强度,而不考虑 形象

编辑:在注释后添加示例。我可能误解了问题所在,但代码/图像说明了如何设置v限制以匹配颜色(顶行),或者如果每个图像自动正常化(底行),会发生什么情况


注意:该问题仅在非零颜色范围不包括零时出现。这是用上面的
offset
变量显示的。

假设您有一个rgb图像列表,即一个包含3个uint8 numpy数组的堆栈,并且您需要添加边框,以便所有图像具有相同的形状。以下功能执行此任务:

def ResizeImages(ImList):
        '''Find the largest width and height of images belonging to a list.
        Return a list of images of same width/height
        '''
        maxwidth=0
        maxheight=0
        components = np.shape(ImList[0])[2]
        imtype = ImList[0].dtype
        for i in range(len(ImList)):
            width=np.shape(ImList[i])[1]#width=column
            height=np.shape(ImList[i])[0]#height=line
            #print "width:height",width,":",height
            if width>maxwidth:maxwidth=width
            if height>maxheight:maxheight=height
        #print "maxwidth:maxheight",maxwidth,":",maxheight                
        NewList=[]
        for i in range(0,len(ImList)):
            width=np.shape(ImList[i])[1]
            height=np.shape(ImList[i])[0]

            diffw=maxwidth-width
            startw=round(diffw/2)
            diffh=maxheight-height
            starth=int(round(diffh/2))
            startw=int(round(diffw/2))

            newIm=np.zeros((maxheight,maxwidth,components), dtype=imtype)
            newIm[starth:starth+height,startw:startw+width,:]=ImList[i][:,:,:]
            NewList.append(newIm)
        return NewList
每个要调整大小的图像都粘贴在一个图像中,该图像首先填充了dtype=uint8类型的零(因为uint8数组是在函数中发送的):

错误就在这里:

newIm=np.zeros((maxheight,maxwidth,components))

由于未指定类型,默认情况下类型为float64,这解释了为什么调整大小后的图像的颜色看起来很奇怪。

假设您有一个rgb图像列表,即一个包含3个numpy数组的uint8的堆栈,并且您需要添加边框,以便所有图像具有相同的形状。以下功能执行此任务:

def ResizeImages(ImList):
        '''Find the largest width and height of images belonging to a list.
        Return a list of images of same width/height
        '''
        maxwidth=0
        maxheight=0
        components = np.shape(ImList[0])[2]
        imtype = ImList[0].dtype
        for i in range(len(ImList)):
            width=np.shape(ImList[i])[1]#width=column
            height=np.shape(ImList[i])[0]#height=line
            #print "width:height",width,":",height
            if width>maxwidth:maxwidth=width
            if height>maxheight:maxheight=height
        #print "maxwidth:maxheight",maxwidth,":",maxheight                
        NewList=[]
        for i in range(0,len(ImList)):
            width=np.shape(ImList[i])[1]
            height=np.shape(ImList[i])[0]

            diffw=maxwidth-width
            startw=round(diffw/2)
            diffh=maxheight-height
            starth=int(round(diffh/2))
            startw=int(round(diffw/2))

            newIm=np.zeros((maxheight,maxwidth,components), dtype=imtype)
            newIm[starth:starth+height,startw:startw+width,:]=ImList[i][:,:,:]
            NewList.append(newIm)
        return NewList
每个要调整大小的图像都粘贴在一个图像中,该图像首先填充了dtype=uint8类型的零(因为uint8数组是在函数中发送的):

错误就在这里:

newIm=np.zeros((maxheight,maxwidth,components))

由于未指定类型,因此默认类型为float64,这解释了为什么调整大小后的图像的颜色看起来很奇怪。

更改vmin/vmax(cmap=pylab.cm.Greys\u r/Greys)对彩色图像没有影响我不理解您的评论。您是建议设置这些值不会影响彩色图像,还是不影响图像?我添加了一些可能有助于解决此问题的示例代码?例如,修改vmax的值不会影响图像的显示方式。看着你的代码,我注意到x2是一个单色图像:np.shape(x2)给出(15,20),而我的例子中的图像是rgb图像,是3个numpy数组的堆栈,它们的尺寸是例如(47,54,3)。颜色贴图仅在传递标量数组时使用,如果mxnx[3,4]数组被传递,则直接使用颜色。啊,好点!我看到do声明,尽管我以前错过了它。不幸的是,在这种情况下,它没有对人工色素提供任何建议。这建议使用伪彩色,只取其中一个维度(或者明显地混合rgb->greyscale)。但这可能不适合您的数据。更改vmin/vmax(cmap=pylab.cm.Greys_r/Greys)对彩色图像没有影响我不理解您的评论。您是建议设置这些值不会影响彩色图像,还是不影响图像?我添加了一些可能有助于解决此问题的示例代码?例如,修改vmax的值不会影响图像的显示方式。看着你的代码,我注意到x2是一个单色图像:np.shape(x2)给出(15,20),而我的例子中的图像是rgb图像,是3个numpy数组的堆栈,它们的尺寸是例如(47,54,3)。颜色贴图仅在传递标量数组时使用,如果mxnx[3,4]数组被传递,则直接使用颜色。啊,好点!我看到do声明,尽管我以前错过了它。不幸的是,在这种情况下,它没有对人工色素提供任何建议。这建议使用伪彩色,只取其中一个维度(或者明显地混合rgb->greyscale)。但这可能不适合您的数据。请检查您的数据类型。int被假定在[0,256]范围内,float被假定在[0,1]范围内,并且没有明确检查这些假设。另外,请不要在帖子上签名,您的用户块已经在底部。新图像的数据类型,调整大小的_rgb[0]是float64!但是如果我打印(np.uint8(调整大小的_rgb[0][25,17:38,:]),图像仍然是蓝色的…图像类型现在可以了。谢谢!您能写一个解释如何修复它的答案吗?(然后在允许的情况下接受)。这里有一个名为ResizeImages()的函数(一个sagemath云项目)。通过指定以下图像的dtype值来修复此问题:newIm=np.zeros((maxheight,maxwidth,components),dtype=imtype)。然后在较大的图像中粘贴一个较小的图像:newIm[starth:starth+height,startw:startw+width,:]=ImList[i][:,:,:,:,:]。由于较小的图像是uint8,新的图像也是uint8。请检查您的数据类型。int假定在[0,256]范围内,浮点假定在[0,1]内并且没有明确检查这些假设。另外,请不要签署您的帖子,您的用户块已经在底部。新图像的数据类型,大小调整后的_rgb[0]是float64!但是如果我打印(np.uint8(大小调整后的_rgb[0][25,17:38,:]),图像仍然是蓝色的…图像类型