我将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')
答案 0 :(得分:1)
正在发生的事情是您的图像在绘图中已自动归一化。这就是为什么在某些区域(颜色大致均一)中的值会延伸到每个极端,从而突出显示来自jpeg压缩的像素。但是,当连接时,它具有边框的深色,因此颜色不会被吹散。
为清楚起见,这意味着您的图块没有像素化,它们只是在matplotlib
中以这种方式显示给您。
要对所有图像进行标准化,请在vmin
中使用vmax
和plt.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)