Matplotlib显示仅含0和255的Canny边缘图为灰度而非纯黑白如何解决
问题根源
你观察到的边缘图存在中间灰度的现象,并非edges数组本身包含0和255以外的数值,而是matplotlib的imshow函数默认开启的图像插值逻辑导致的:默认的插值算法会在不同颜色的像素边界处自动计算过渡色,让显示效果更平滑,刚好把只有纯黑、纯白两种值的边缘图渲染出了过渡灰度。
修复方案
只需要在绘制边缘图的imshow调用中,添加interpolation='nearest'参数即可,该参数会关闭插值逻辑,直接使用像素原始值渲染,保证输出只有纯黑和纯白两种颜色。额外添加vmin=0和vmax=255可以进一步锁定灰度映射范围,避免因自动范围计算出现偏差。
修改后的完整代码如下:
import cv2 import matplotlib.pyplot as plt in_img = cv2.imread('colored_image.jpeg') gray_in_img = cv2.cvtColor(in_img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray_in_img, 100, 155) fig = plt.figure(1) ax = fig.add_subplot(1, 3, 1) ax.imshow(cv2.cvtColor(in_img, cv2.COLOR_BGR2RGB)) ax = fig.add_subplot(1, 3, 2) ax.imshow(gray_in_img, cmap='gray') ax = fig.add_subplot(1, 3, 3) # 仅修改下方这行,添加插值和灰度范围参数 ax.imshow(edges, cmap='gray', interpolation='nearest', vmin=0, vmax=255) plt.show()
内容的提问来源于stack exchange,提问作者ChikChak
相关产品推荐
相关产品推荐

