小轮廓变大轮廓morphologyEx

本文介绍了OpenCV中的morphologyEx()函数,用于执行形态学变换,包括开运算、闭运算、形态学梯度、顶帽和黑帽。通过示例代码展示了如何使用结构元素对二值图像进行闭运算,以消除小黑洞,并找到图像中的最大轮廓并绘制出边界框。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

openvc中morphologyEx()函数是一种形态学变化函数。数学形态学可以理解为一种滤波行为,因此也称为形态学滤波。滤波中用到的滤波器(kernal),在形态学中称为结构元素。结构元素往往是由一个特殊的形状构成,如线条、矩形、圆等。

 开运算(open):先腐蚀后膨胀的过程。开运算可以用来消除小黑点,在纤细点处分离物体、平滑较大物体的边界的   同时并不明显改变其面积。

 闭运算(close):先膨胀后腐蚀的过程。闭运算可以用来排除小黑洞。

 形态学梯度(morph-grad):可以突出团块(blob)的边缘,保留物体的边缘轮廓。

 顶帽(top-hat):将突出比原轮廓亮的部分。

 黑帽(black-hat):将突出比原轮廓暗的部分。

代码举例:

    mask = cv2.inRange(image_hsv,lower_hsv,upper_hsv)

    # getStructuringElement函数会返回指定形状和尺寸的结构元素

    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

    # morphologyEx 形态学变化函数

    mask = cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)
mport cv2

import numpy as np

img = cv2.imread('test.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

_, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

kernel = np.ones((3,3), dtype=np.uint8)

closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)

_, contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

cnt = max(contours, key=cv2.contourArea)

x,y,w,h = cv2.boundingRect(cnt)

cv2.rectangle(img, (x,y), (x+w, y+h), (255,255,0), 1)

cv2.imshow('img', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

参考:

https://blog.youkuaiyun.com/weixin_38796384/article/details/85008766

https://blog.youkuaiyun.com/weixin_36079903/article/details/114360039

https://www.freesion.com/article/3798512773/

<think>好的,我现在需要处理用户的问题:“请使用中文回答我或者给我介绍一下: python 区域图片轮廓大小在一定范围内的”。首先,我要理解用户的需求。用户可能想要在Python中找到并筛选图像中轮廓大小在特定范围内的区域。这可能用于图像处理任务,比如物体检测、区域分割等。 用户之前的问题是关于凸四边形顶点处理的,现在转向轮廓大小筛选,可能是相关项目的一部分,比如在检测到四边形区域后进一步处理其中的内容。我需要确保回答结构清晰,分步骤介绍处理方法,并提供代码示例。 首先,我需要确定用户所说的“轮廓大小”具体指什么。通常轮廓的大小可以用面积、周长、外接矩形尺寸等来衡量。常见的是使用面积,所以我会假设用户指的是面积范围。需要确认是否包括面积、周长或其他指标,但为了通用性,可能同时提到多种方法。 接下来,处理步骤可能包括:读取图像、预处理(如灰度化、二值化)、查找轮廓、计算轮廓属性、筛选符合大小范围的轮廓,并可能进行可视化或后续处理。需要详细说明每一步,并提供代码示例,特别是使用OpenCV库,因为这是处理图像轮廓的常用工具。 同时,用户可能需要知道如何调整范围参数,如何处理多个轮廓,以及常见的注意事项,比如预处理对轮廓检测的影响,轮廓层级结构等。此外,要确保代码示例正确,比如正确使用cv2.findContours函数,注意不同OpenCV版本的参数差异。 还需要考虑用户可能的错误,比如图像路径错误、未正确预处理导致轮廓检测不准确,或者筛选条件设置不当。在注意事项中应提到这些点,帮助用户避免常见陷阱。 最后,结合用户之前关于凸四边形的问题,可能在后续处理中需要结合两者,比如检测四边形区域后再分析内部轮廓的大小,但当前问题主要集中在轮廓大小筛选,所以应专注于这一部分,保持回答的针对性。 总结回答结构:基本概念、处理步骤(包括代码示例)、参数调节建议、应用场景和注意事项。确保使用正确的中文术语,代码注释清晰,并验证代码的正确性,例如使用合适的测试图像,确保筛选逻辑正确。</think>以下分步骤介绍如何在Python中筛选图像轮廓大小在指定范围内的实现方法: --- ### 一、基本概念 **轮廓大小筛选**:指通过计算图像中检测到的轮廓面积或外接矩形尺寸,筛选出符合特定范围要求的区域。常用于: 1. 去除噪点(过滤小面积轮廓) 2. 定位特定尺寸的物体 3. 批量处理图像中的有效区域 --- ### 二、实现步骤与代码示例 #### 1. 图像预处理 ```python import cv2 import numpy as np # 读取图像并转为灰度图 image = cv2.imread('input.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 二值化处理(根据实际情况选择阈值方法) _, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 可选:去噪操作 kernel = np.ones((3,3), np.uint8) opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2) ``` #### 2. 轮廓检测 ```python # 查找轮廓(注意OpenCV4.x版本返回2个值) contours, hierarchy = cv2.findContours( opening, cv2.RETR_EXTERNAL, # 仅检测外部轮廓 cv2.CHAIN_APPROX_SIMPLE ) ``` #### 3. 轮廓筛选 ##### 方法一:按面积筛选 ```python min_area = 100 # 最小面积阈值 max_area = 5000 # 最大面积阈值 filtered_contours = [] for cnt in contours: area = cv2.contourArea(cnt) if min_area < area < max_area: filtered_contours.append(cnt) ``` ##### 方法二:按外接矩形尺寸筛选 ```python min_width, min_height = 50, 30 max_width, max_height = 200, 150 filtered_contours = [] for cnt in contours: x,y,w,h = cv2.boundingRect(cnt) if (min_width < w < max_width) and (min_height < h < max_height): filtered_contours.append(cnt) ``` #### 4. 结果可视化 ```python # 在原图上绘制筛选后的轮廓 result = image.copy() cv2.drawContours(result, filtered_contours, -1, (0,255,0), 2) # 显示结果 cv2.imshow('Filtered Contours', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` --- ### 三、参数调节建议 1. **动态范围设置**:可通过图像尺寸的百分比设置范围 ```python img_area = image.shape[0] * image.shape[1] min_area = 0.01 * img_area # 占图像总面积1% max_area = 0.5 * img_area # 占图像总面积50% ``` 2. **自适应阈值**:对于光照不均匀的情况 ```python thresh = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) ``` --- ### 四、应用场景示例 | 场景 | 筛选标准 | |-------|---------| | 细胞计数 | 面积范围:100-500像素² | | 工业零件检测 | 宽度范围:80-120像素 | | 文档扫描 | 高宽比接近A4纸比例(√2:1) | --- ### 五、注意事项 1. **预处理影响**:二值化质量直接决定轮廓检测准确性 2. **层级结构**:使用`cv2.RETR_TREE`可获取轮廓层级关系 3. **轮廓近似**:`cv2.CHAIN_APPROX_SIMPLE`可减少轮廓点数 4. **性能优化**:大图像建议先缩放处理 5. **边缘情况**:处理全白/全黑图像时需添加异常检测 --- ### 六、完整代码模板 ```python import cv2 import numpy as np class ContourFilter: def __init__(self, image_path): self.image = cv2.imread(image_path) self.gray = cv2.cvtColor(self.image, cv2.COLOR_BGR2GRAY) def preprocess(self): self.thresh = cv2.adaptiveThreshold( self.gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) kernel = np.ones((3,3), np.uint8) self.processed = cv2.morphologyEx(self.thresh, cv2.MORPH_OPEN, kernel) def filter_contours(self, area_range=(100,5000), wh_range=None): contours, _ = cv2.findContours( self.processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) self.filtered = [] for cnt in contours: # 面积筛选 area = cv2.contourArea(cnt) if not (area_range[0] < area < area_range[1]): continue # 外接矩形筛选(可选) if wh_range: x,y,w,h = cv2.boundingRect(cnt) if not (wh_range[0][0] < w < wh_range[0][1] and wh_range[1][0] < h < wh_range[1][1]): continue self.filtered.append(cnt) return self.filtered def visualize(self): result = self.image.copy() cv2.drawContours(result, self.filtered, -1, (0,255,0), 2) cv2.imshow('Result', result) cv2.waitKey(0) # 使用示例 processor = ContourFilter('test.jpg') processor.preprocess() processor.filter_contours( area_range=(500, 10000), wh_range=((50,200), (30,150)) # (宽度范围), (高度范围) ) processor.visualize() ``` --- 通过调整`area_range`和`wh_range`参数,可灵活适应不同场景的筛选需求。实际应用中建议结合形态学操作和多种筛选条件进行综合判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DLANDML

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值