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

Python 为什么图像块在提取时变得像素化,但在连接时变得正常?,python,opencv,matplotlib,Python,Opencv,Matplotlib,我正在将一张200x200的图像分割为16张50x50的图像,但其中两张图像是像素化的,颜色不正确 img = cv2.imread('nothingZ.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) windowsize_r = 50 windowsize_c = 50 window = [] for r in range(0,gra

我正在将一张200x200的图像分割为16张50x50的图像,但其中两张图像是像素化的,颜色不正确

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')

发生的情况是,您的图像在打印时自动标准化。这就是为什么在某些区域(颜色大致一致)的值会延伸到每个极端,突出显示jpeg压缩的像素。但是当连接时,它有来自边框的深色,所以颜色不会被吹出

为清晰起见,这意味着块不是像素化的,它们只是以这种方式显示在
matplotlib

要使所有图像正常化,请使用
plt.imshow()
中的
vmin
vmax
参数。从:

vmin,vmax:标量,可选 当使用标量数据且无显式范数时,vmin和vmax定义colormap覆盖的数据范围默认情况下,颜色映射覆盖所提供数据的完整值范围。vmin,vmax如果使用norm参数将被忽略

我增加了重点

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

若要使用参数并修复打印问题,请替换

plt.imshow(array2, 'gray')


原著。分割图像。连接的imageHi,欢迎使用SO。请不要在评论中提供其他信息,而是用一个新的标题更新问题。阅读了解更多信息。
moveaxis
调用有什么用?为什么不在窗口中显示el:imshow(el,‘灰色’)?
plt.imshow(array2, 'gray', vmin=0, vmax=255)