提取图像中的特定区域

这段代码是使用HALCON软件编写的,HALCON是一个用于机器视觉和图像处理的高级编程语言。代码的主要功能是处理一组图像,并对每张图像执行一系列图像处理操作

dev_update_window (‘off’)
read_image (Fins, ‘fin’ + [1:3])
get_image_size (Fins, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width[0], Height[0], ‘black’, WindowID)
set_display_font (WindowID, 14, ‘mono’, ‘true’, ‘false’)
for I := 1 to 3 by 1
select_obj (Fins, Fin, I)
dev_display (Fin)
binary_threshold (Fin, Background, ‘max_separability’, ‘light’, UsedThreshold)
dev_set_color (‘blue’)
dev_set_draw (‘margin’)
dev_set_line_width (4)
dev_display (Background)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
closing_circle (Background, ClosedBackground, 250)
dev_set_color (‘green’)
dev_display (ClosedBackground)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
difference (ClosedBackground, Background, RegionDifference)
opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
dev_display (Fin)
dev_set_color (‘red’)
dev_display (FinRegion)
area_center (FinRegion, FinArea, Row, Column)
if (I < 3)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
endif
endfor

fin1.png
在这里插入图片描述
fin2.png
在这里插入图片描述
fin3.png
在这里插入图片描述
以下是程序运行结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下是代码的逐行解释:

dev_update_window (‘off’): 关闭窗口的自动更新,以避免在处理过程中显示不完整的图像。

read_image (Fins, ‘fin’ + [1:3]): 读取名为’fin1’, ‘fin2’, 'fin3’的三张图像,并将它们存储在Fins数组中。

get_image_size (Fins, Width, Height): 获取Fins数组中图像的宽度和高度,并将结果存储在Width和Height数组中。

dev_close_window (): 关闭当前打开的所有窗口。

dev_open_window (, , Width[], Height[], ‘black’, WindowID): 打开一个新的窗口,窗口的位置在屏幕左上角,大小与第一张图像相同,背景颜色为黑色,并将窗口ID存储在WindowID变量中。

set_display_font (WindowID, 14, ‘mono’, ‘true’, ‘false’): 设置窗口中显示文本的字体大小、类型和样式。

for I := 1 to 3 by 1: 开始一个循环,从1到3,每次增加1。

select_obj (Fins, Fin, I): 从Fins数组中选择第I张图像,存储在Fin变量中。

dev_display (Fin): 显示当前选中的图像。

binary_threshold (Fin, Background, ‘max_separability’, ‘light’, UsedThreshold): 对Fin图像应用最大可分性二值化阈值,得到背景图像Background,并记录使用的阈值。

dev_set_color (‘blue’): 设置绘图颜色为蓝色。

dev_set_draw (‘margin’): 设置绘图模式为边缘绘制。

dev_set_line_width (4): 设置线条宽度为4。

dev_display (Background): 显示背景图像。

disp_continue_message (WindowID, ‘black’, ‘true’): 在窗口中显示继续消息,文本颜色为黑色,消息持续显示。

stop (): 等待用户操作,直到按下任意键。

closing_circle (Background, ClosedBackground, 250): 对Background图像应用圆形闭运算,半径为250,得到ClosedBackground图像。

dev_set_color (‘green’): 设置绘图颜色为绿色。

dev_display (ClosedBackground): 显示经过闭运算后的图像。

重复步骤15和16。

difference (ClosedBackground, Background, RegionDifference): 计算ClosedBackground和Background的差异,得到RegionDifference图像。

opening_rectangle1 (RegionDifference, FinRegion, 5, 5): 对RegionDifference图像应用矩形开运算,尺寸为5x5,得到FinRegion图像。

dev_display (Fin): 重新显示原始图像。

dev_set_color (‘red’): 设置绘图颜色为红色。

dev_display (FinRegion): 显示开运算后的区域。

area_center (FinRegion, FinArea, Row, Column): 计算FinRegion图像的面积中心,结果存储在FinArea, Row, Column变量中。

if (I < 3): 如果当前处理的图像不是最后一张,则执行以下操作。

重复步骤15和16。

endif: 结束条件判断。

endfor: 结束循环。

这段代码主要用于图像的预处理和特征提取,通过二值化、闭运算和开运算等操作,提取图像中的特定区域。

在 OpenCV 中,`mask` 是一种用于图像处理的二值化矩阵,常用于提取图像中的特定区域(Region of Interest, ROI)。通过 `mask` 可以将图像中感兴趣的部分保留,而将不感兴趣的部分屏蔽或置为黑色。 ### 提取图像特定区域的方法 在图像处理中,经常需要对图像特定区域进行操作,例如提取某个颜色区域、形状区域或轮廓区域。OpenCV 提供了多种方法实现这一功能,其中最常用的是使用 `cv2.bitwise_and` 函数结合 `mask` 进行图像掩膜操作。 以下是一个典型的图像掩膜处理流程: 1. **创建 mask 图像**:首先需要构造一个与原始图像大小相同的二值图像 `mask`,其中感兴趣的区域设置为白色(255),其余区域设置为黑色(0)。 2. **应用 mask**:使用 `cv2.bitwise_and` 函数将原始图像与 `mask` 进行按位与操作,从而提取出感兴趣的区域。 示例代码如下: ```python import cv2 import numpy as np # 读取图像 image = cv2.imread('image.png') # 创建一个与图像大小相同的空白 mask mask = np.zeros(image.shape[:2], dtype=np.uint8) # 定义感兴趣区域的多边形顶点 points = np.array([[100, 200], [500, 300], [520, 460], [300, 420], [200, 330], [100, 250]]) # 在 mask 上绘制多边形并填充白色 cv2.fillPoly(mask, [points], color=255) # 应用 mask 提取图像区域 result = cv2.bitwise_and(image, image, mask=mask) # 显示结果 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 多边形区域提取 在某些场景中,感兴趣区域可能是一个不规则的多边形区域。OpenCV 提供了 `cv2.fillPoly` 函数用于在 `mask` 上绘制多边形并填充颜色,从而构建出一个不规则的掩膜区域。该方法适用于提取复杂形状的图像区域[^3]。 ### 提取特定颜色区域提取图像特定颜色区域时,通常会先将图像从 RGB 色彩空间转换到 HSV 色彩空间,这样可以更方便地定义颜色范围。然后通过 `cv2.inRange` 函数创建一个二值化的 `mask`,再使用 `cv2.bitwise_and` 提取目标颜色区域[^2]。 ### 利用轮廓提取目标区域 当需要提取图像中的特定轮廓区域时,可以通过 `cv2.findContours` 获取目标轮廓,然后使用 `cv2.fillPoly` 在 `mask` 上填充该轮廓区域,最后通过 `cv2.bitwise_and` 将原始图像与 `mask` 相结合,提取出目标区域[^5]。 ### 总结 在 OpenCV 中,使用 `mask` 提取图像特定区域是一种高效且灵活的方式。通过构造二值图像 `mask`,结合 `cv2.bitwise_and` 函数,可以精确地提取图像中的感兴趣区域。此方法广泛应用于图像分割、目标检测、颜色提取等任务中。
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Happy Monkey

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

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

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

打赏作者

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

抵扣说明:

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

余额充值