求问如何提取图片中的白色区域的轮廓?
这是用红外相机拍摄的火焰图片,图中红圈区域是相机出现了问题产生的噪声。
我用canny算法提取边界的时候噪声会产生影响,而且边界不连续
机械领域研一小白,不知各位有没有方法能够去除噪声的影响,提取出白色区域的轮廓?
十分感谢!
求问如何提取图片中的白色区域的轮廓?
这是用红外相机拍摄的火焰图片,图中红圈区域是相机出现了问题产生的噪声。
我用canny算法提取边界的时候噪声会产生影响,而且边界不连续
机械领域研一小白,不知各位有没有方法能够去除噪声的影响,提取出白色区域的轮廓?
十分感谢!
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
您可以尝试以下几种方法:
a. 二值化处理:将图像转换为二值图像,使白色区域为255,黑色区域为0。可以使用阈值分割等方法进行处理。
b. 膨胀操作:使用一个结构元素对二值图像进行膨胀,可以填充白色区域中的空洞,使其更加连续。
c. 腐蚀操作:使用一个结构元素对二值图像进行腐蚀,可以消除白色区域中的噪声点,使其更加连续。
d. 边界提取:使用膨胀后的图像减去腐蚀后的图像,可以得到白色区域的边界。
下面是 Python 中使用 OpenCV 库实现形态学操作的代码:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('fire.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化处理
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 定义结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
# 膨胀操作
dilated = cv2.dilate(binary, kernel)
cv2.imshow('dilated', dilated)
# 腐蚀操作
eroded = cv2.erode(binary, kernel)
cv2.imshow('eroded', eroded)
# 边界提取
boundaries = dilated - eroded
cv2.imshow('boundaries', boundaries)
cv2.waitKey(0)
a. 边缘检测:使用 Canny 算法等方法进行边缘检测,得到图像中所有的边缘。
b. 霍夫变换:使用霍夫变换,可以将边缘检测得到的直线转换为参数方程,这样就可以方便地对直线进行处理。
c. 直线筛选:根据直线的参数方程,可以筛选出与噪声区域相交的直线,然后把这些直线合并为一个区域。
d. 轮廓提取:对这个区域进行轮廓提取,就可以得到目标区域的轮廓。
下面是 Python 中使用 OpenCV 库实现霍夫变换的代码:
import cv2
import numpy as np
# 读取图像
img = cv2.imread('fire.jpg', cv2.IMREAD_GRAYSCALE)
# 边缘检测
edges = cv2.Canny(img, 100, 200)
# 霍夫变换
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=50, maxLineGap=10)
# 直线筛选
region = np.zeros_like(img)
for line in lines:
x1, y1, x2, y2 = line[0]
if 450 < x1 < 600 and 450 < x2 < 600 and 200 < y1 < 400 and 200 < y2 < 400:
cv2.line(region, (x1, y1), (x2, y2), 255, 3)
# 轮廓提取
contours, hierarchy = cv2.findContours(region, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (255, 255, 255), 3)
cv2.imshow('result', img)
cv2.waitKey(0)
注意:
对于两种方法,两种方法只能得到白色区域的轮廓,得到的图像可能不会和原图完全重合。
针对第一种方法,结构元素的大小和形状会影响到结果,需要根据实际情况进行调整。
需要花费一定的时间来调整参数和代码,才能得到最终的结果。
如果我的回答解决了您的问题,请采纳!