如何应用阈值算子高亮最大目标?OpenCV代码报错求助
问题修复与最大目标高亮实现
错误原因
cv2.threshold()返回的是**(计算出的阈值, 二值化图像)**的元组,你直接将这个元组当作图像传入cv2.imshow()和np.hstack(),导致类型不匹配,触发重载解析失败错误。
修正后代码(含最大目标高亮)
import cv2 import numpy as np # 读取灰度图像 img_hubble = cv2.imread("hubble.png", 0) # 均值模糊处理 kernel = np.ones((15,15), np.float32)/225 dst = cv2.filter2D(img_hubble, -1, kernel) # 二值化处理,正确接收返回值 _, thresh_img = cv2.threshold(dst, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 检测图像中的轮廓 contours, _ = cv2.findContours(thresh_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 生成最大目标高亮图像 largest_obj_img = np.zeros_like(img_hubble) if contours: # 筛选面积最大的轮廓 max_contour = max(contours, key=cv2.contourArea) # 填充最大轮廓,实现高亮 cv2.drawContours(largest_obj_img, [max_contour], 0, 255, cv2.FILLED) # 拼接三张对比图像 result = np.hstack((img_hubble, dst, largest_obj_img)) # 显示结果 cv2.imshow('Original | Blurred | Largest Object', result) cv2.waitKey(0) cv2.destroyAllWindows()
关键修改说明
- 修复阈值接收:用
_, thresh_img拆分cv2.threshold()的返回值,仅保留二值化图像。 - 最大目标检测:通过
cv2.findContours()提取轮廓,利用cv2.contourArea()作为筛选条件找到最大轮廓,再用填充绘制的方式高亮目标。 - 图像拼接:确保
np.hstack()传入的是三张同维度的单通道图像,避免拼接失败。
内容的提问来源于stack exchange,提问作者DIlshanSandaruwan
相关产品推荐
相关产品推荐

