如何使用python去除图像中的边界边缘噪声?

2024-09-30 22:24:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过去除图像中的黑色边界和无关的非眼睛特征(例如,文本和“剪辑”见下文),用3个随机方块中的平均像素值替换黑色区域,来预处理眼部血管的照片。在

crop1 = randomCrop(image2, 50, 50) #Function that finds random 50x50 area
crop2 = randomCrop(image2, 50, 50)
crop3 = randomCrop(image2, 50, 50)

mean1 = RGB_Mean(crop1)
mean2 = RGB_Mean(crop2)
mean3 = RGB_Mean(crop3)

#RGB Mean
result = [statistics.mean(k) for k in zip(mean1, mean2, mean3)]

for i in range(len(image2[:,0, 0])):
    for j in range(len(image2[0,:,0])):
        thru_pixel = image2[i, j]
        if (thru_pixel[0] < 50 and thru_pixel[1] < 50 and thru_pixel[2] < 50):
            image2[i,j, :] = result
        if (thru_pixel[0] > 190 and thru_pixel[1] > 190 and thru_pixel[2] > 190):
            image2[i,j, :] = result

但是,在图像的边框周围有剩余的噪声,以及左下角的文本和剪辑。在

下面是一个示例图像。在

原件:

enter image description here

以及后期处理

enter image description here

你可以看到仍然有左边的黑灰色边框噪音,以及右下角的文本和左下角的“剪辑”。我有什么办法可以在保持眼部血管完整的同时去掉这些文物吗?在

感谢您的时间和帮助!在


Tags: andin图像文本for剪辑rgbresult
1条回答
网友
1楼 · 发布于 2024-09-30 22:24:42

假设你想隔离眼部血管,这里有一个方法可以分为两个阶段,一个是去除伪影,另一个是隔离血管

  • 将图像转换为灰度
  • 二值图像的Otsu阈值法
  • 执行形态学操作去除伪影
  • 血管分离的自适应阈值
  • 利用最大阈值区域寻找轮廓并进行滤波
  • 按位与得到最终结果

从原始图像开始,我们转换为灰度和大津阈值以获得二值图像

enter image description here

现在我们执行变形打开来移除工件(左)。我们反转这个掩模以获得白色边界,然后进行一系列按位运算以获得去除的伪影图像(右)

enter image description hereenter image description here

从这里我们自适应阈值得到静脉

enter image description here

注意这里有不需要的边界,所以我们找到轮廓并使用最大阈值区域进行过滤。如果轮廓通过过滤器,我们将其绘制到一个空白遮罩上

enter image description here

最后,我们对原始图像进行位与运算以得到结果

enter image description here

注意,我们可以在自适应阈值之后执行额外的变形打开来去除小的噪声粒子,但是折衷的是它将删除静脉细节。我把这一步留给你

import cv2
import numpy as np

# Grayscale, Otsu's threshold, opening
image = cv2.imread('1.png')
blank_mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15,15))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)

inverse = 255 - opening
inverse = cv2.merge([inverse,inverse,inverse])
removed_artifacts = cv2.bitwise_and(image,image,mask=opening)
removed_artifacts = cv2.bitwise_or(removed_artifacts, inverse)

# Isolate blood vessels
veins_gray = cv2.cvtColor(removed_artifacts, cv2.COLOR_BGR2GRAY)
adaptive = cv2.adaptiveThreshold(veins_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,3)

cnts = cv2.findContours(adaptive, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

for c in cnts:
    area = cv2.contourArea(c)
    if area < 5000:
        cv2.drawContours(blank_mask, [c], -1, (255,255,255), 1)

blank_mask = cv2.cvtColor(blank_mask, cv2.COLOR_BGR2GRAY)
final = cv2.bitwise_and(image, image, mask=blank_mask)
# final[blank_mask==0] = (255,255,255) # White version

cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('removed_artifacts', removed_artifacts)
cv2.imshow('adaptive', adaptive)
cv2.imshow('blank_mask', blank_mask)
cv2.imshow('final', final)
cv2.waitKey()

相关问题 更多 >