如何在OpenCV中使用Canny边缘检测并保留彩色图像?Python问题求助
解决Canny边缘检测无轮廓及原图显示问题的方法
核心问题分析
- 你用
cv.imread('BlueSquare.png',0)直接读取灰度图,蓝色方框转灰度后的像素值大概率远低于设置的Canny阈值(100-200),导致边缘完全检测不到,所以边缘图全黑。 - 用灰度图加
Blues色板显示,自然和原图真实颜色不符。
修正步骤及代码
- 先读取彩色原图,保留色彩信息,再转灰度图用于边缘检测
- 降低Canny阈值,适配蓝色方框转灰度后的像素值
- 将检测到的白色边缘叠加到原图上,得到带白色轮廓的目标图像
- 转换BGR格式到RGB,适配matplotlib的显示要求
修正后的代码:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt # 读取彩色原图(OpenCV默认BGR格式) img_bgr = cv.imread('BlueSquare.png') # 转灰度图用于Canny边缘检测 gray = cv.cvtColor(img_bgr, cv.COLOR_BGR2GRAY) # 调整Canny阈值(示例用50-150,可根据实际图像像素值微调) edges = cv.Canny(gray, 50, 150) # 创建带白色轮廓的原图副本 img_with_edges = img_bgr.copy() # 将边缘区域像素设为白色(BGR格式的白色为(255,255,255)) img_with_edges[edges != 0] = (255, 255, 255) # 转换BGR到RGB,适配matplotlib的显示格式 img_rgb = cv.cvtColor(img_bgr, cv.COLOR_BGR2RGB) img_with_edges_rgb = cv.cvtColor(img_with_edges, cv.COLOR_BGR2RGB) # 绘图展示 plt.subplot(121), plt.imshow(img_rgb) plt.title('Original Image'), plt.xticks([]), plt.yticks([]) plt.subplot(122), plt.imshow(img_with_edges_rgb) plt.title('Image with White Edges'), plt.xticks([]), plt.yticks([]) plt.show()
额外提示
- 如果调整阈值后仍检测不到边缘,可以打印灰度图的像素值范围(
print(np.min(gray), np.max(gray))),再把Canny低阈值设为略低于最大值,高阈值设为最大值的1.5-2倍。 - 若想要更柔和的边缘叠加效果,可替换像素赋值为
cv.addWeighted图像融合方式。
内容的提问来源于stack exchange,提问作者Gamer
相关产品推荐
相关产品推荐

