如何使用 Python 去除金相图像上的划痕
How to remove scratches from metallographic images using Python
我有以下图像来分析和提取其中的孔隙率(黑点)。
我的问题是我的代码可能会发现划痕(抛光横截面造成的缺陷)。
我正在寻找去除划痕的方法。
我尝试了修复 (https://github.com/Chandrika372/Image-Restoration-by-Inpainting-Algorithm/blob/main/Inpainting.py),但划痕太小而无法检测到。我还在 C 和 Matlab 上找到了几个例子 运行,但是如果我使用我的图像作为输入,输出仍然是一样的;对于算法来说,划痕似乎太细了。
如有任何帮助,我们将不胜感激。
一个简单的Otsu's threshold should do it. The idea is to Gaussian blur to remove noise then cv2.bitwise_and
提取点。
二进制图像
结果
您还可以选择使用 contour area filtering 和阈值
过滤掉 large/small 个点
import cv2
# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# OPTIONAL to filter out small/large dots using contour area filtering
# Adjust the area to only keep larger dots
'''
DOT_AREA = 10
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < DOT_AREA:
cv2.drawContours(thresh, [c], -1, 0, -1)
'''
# Bitwise_and to extract dots
result = cv2.bitwise_and(image, image, mask=thresh)
result[thresh==0] = 255
cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey()
我有以下图像来分析和提取其中的孔隙率(黑点)。
我的问题是我的代码可能会发现划痕(抛光横截面造成的缺陷)。 我正在寻找去除划痕的方法。
我尝试了修复 (https://github.com/Chandrika372/Image-Restoration-by-Inpainting-Algorithm/blob/main/Inpainting.py),但划痕太小而无法检测到。我还在 C 和 Matlab 上找到了几个例子 运行,但是如果我使用我的图像作为输入,输出仍然是一样的;对于算法来说,划痕似乎太细了。
如有任何帮助,我们将不胜感激。
一个简单的Otsu's threshold should do it. The idea is to Gaussian blur to remove noise then cv2.bitwise_and
提取点。
二进制图像
结果
您还可以选择使用 contour area filtering 和阈值
过滤掉 large/small 个点import cv2
# Load image, grayscale, Gaussian blur, Otsu's threshold
image = cv2.imread("1.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# OPTIONAL to filter out small/large dots using contour area filtering
# Adjust the area to only keep larger dots
'''
DOT_AREA = 10
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < DOT_AREA:
cv2.drawContours(thresh, [c], -1, 0, -1)
'''
# Bitwise_and to extract dots
result = cv2.bitwise_and(image, image, mask=thresh)
result[thresh==0] = 255
cv2.imshow("thresh", thresh)
cv2.imshow("result", result)
cv2.waitKey()