为什么图像块在提取时会变得像素化但在连接时会变为正常图像?

时间:2019-01-03 07:08:33

标签: python opencv matplotlib

我将200x200的图像分割为16个50x50的图像,但是其中有2个像素化并且颜色错误

img = cv2.imread('nothingZ.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
windowsize_r = 50
windowsize_c = 50
window = []                                                      
for r in range(0,gray.shape[0], windowsize_r):
 for c in range(0,gray.shape[0], windowsize_c):
  window.append(gray[r:r+windowsize_r,c:c+windowsize_c])
for i, el in enumerate(window):
 array2 = np.moveaxis(window[i], 0, 0)    
 plt.subplot(4, 4, i + 1)
 plt.imshow(array2, 'gray')     
plt.show()
vis2 = np.concatenate((window[4], window[5], window[6]), axis=1)
plt.imshow(vis2,'gray')

1 个答案:

答案 0 :(得分:1)

正在发生的事情是您的图像在绘图中已自动归一化。这就是为什么在某些区域(颜色大致均一)中的值会延伸到每个极端,从而突出显示来自jpeg压缩的像素。但是,当连接时,它具有边框的深色,因此颜色不会被吹散。

为清楚起见,这意味着您的图块没有像素化,它们只是在matplotlib中以这种方式显示给您。

要对所有图像进行标准化,请在vmin中使用vmaxplt.imshow()参数。来自imshow() docs

  

vmin,vmax :标量,可选   当使用标量数据且没有明确的规范时, vmin vmax 定义颜色图覆盖的数据范围。 默认情况下,颜色图会覆盖所提供数据的整个值范围。 vmin vmax 如果使用norm参数,则会被忽略。

我增加了重点。

换句话说,图像的最低值设置为黑色,而最高值设置为白色。如果您的图像仅具有值123、125、127、129、131,则意味着它们(有效)被映射到亮度值0、51、102、153、204、255(或附近)。因此,颜色接近的东西会被吹成完全不同的颜色。通常,由于颜色相似,因此jpeg压缩伪影不太明显,但是将其拉伸时,非常明显。

要使用参数并解决打印问题,请替换

plt.imshow(array2, 'gray')

plt.imshow(array2, 'gray', vmin=0, vmax=255)