Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python从图像中去除边界噪声?_Python_Opencv_Image Processing_Computer Vision_Image Preprocessing - Fatal编程技术网

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

如何使用python从图像中去除边界噪声?,python,opencv,image-processing,computer-vision,image-preprocessing,Python,Opencv,Image Processing,Computer Vision,Image Preprocessing,我试图通过删除图像中的黑色边框和无关的非眼睛特征(例如,文本和“剪辑”见下文),用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

我试图通过删除图像中的黑色边框和无关的非眼睛特征(例如,文本和“剪辑”见下文),用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
crop1=randomCrop(image2,50,50)#查找随机50x50区域的函数
crop2=随机裁剪(图像2、50、50)
crop3=随机裁剪(图像2、50、50)
平均值1=RGB_平均值(crop1)
平均值2=RGB_平均值(crop2)
平均值3=RGB_平均值(crop3)
#RGB均值
结果=[统计。zip中k的平均值(k)(平均值1,平均值2,平均值3)]
对于范围内的i(len(图像2[:,0,0]):
对于范围内的j(len(图像2[0,:,0]):
通过像素=图像2[i,j]
如果(通过像素[0]<50和通过像素[1]<50和通过像素[2]<50):
图像2[i,j:]=结果
如果(通过像素[0]>190和通过像素[1]>190和通过像素[2]>190):
图像2[i,j:]=结果
但是,图像边框周围有剩余的噪波,左下角也有剩余的文本和剪辑

下面是一个示例图像

原件:

和后处理

您可以看到,在右下角仍然有剩余的黑灰色边框噪音以及文本,在左下角还有一个“剪辑”。在保持眼部血管完整性的同时,我是否可以尝试去除这些人工制品


谢谢你的时间和帮助

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

  • 将图像转换为灰度
  • 大津阈值法获取二值图像
  • 执行形态学操作以移除瑕疵
  • 自适应阈值法分离血管
  • 查找轮廓并使用最大阈值区域进行过滤
  • 按位和以获得最终结果

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

现在,我们执行“变形打开”以移除瑕疵(左)。我们反转此遮罩以获得白色边框,然后执行一系列逐位操作以获得移除的伪影图像(右)

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

注意,存在不需要的边界,因此我们找到轮廓并使用最大阈值区域进行过滤。如果轮廓通过过滤器,我们将其绘制到空白遮罩上

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

请注意,我们可以在自适应阈值之后执行附加的“变形打开”,以移除小的噪波粒子,但折衷是它将移除静脉细节。我将把这一可选步骤留给你

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()
导入cv2
将numpy作为np导入
#灰度,大津阈值,打开
image=cv2.imread('1.png')
空白屏蔽=np.Zero(image.shape,dtype=np.uint8)
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh\u二进制+cv2.thresh\u大津)[1]
kernel=cv2.getStructuringElement(cv2.morp_RECT,(15,15))
opening=cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel,迭代次数=3)
反向=255-打开
反向=cv2.合并([反向,反向,反向])
移除的_伪影=cv2。按位_和(图像、图像、掩码=打开)
移除的\u伪影=cv2.按位\u或(移除的\u伪影,反向)
#隔离血管
纹理\u灰色=cv2.CVT颜色(移除的\u瑕疵,cv2.COLOR\u BGR2GRAY)
自适应=cv2.自适应阈值(纹理灰度,255,cv2.自适应阈值高斯C,cv2.阈值二进制INV,11,3)
cnts=cv2.findContours(自适应、cv2.RETR\u树、cv2.CHAIN\u近似、简单)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于5000:
cv2.绘制轮廓图(空白掩模,[c],-1,(255255),1)
空白遮罩=cv2.CVT彩色(空白遮罩,cv2.COLOR\U BGR2GRAY)
final=cv2.按位_和(图像、图像、掩码=空白_掩码)
#最终[空白遮罩==0]=(255255255)#白色版本
cv2.imshow('thresh',thresh)
cv2.imshow(“开始”,开始)
cv2.imshow('移除的\u工件',移除的\u工件)
cv2.imshow(“自适应”,自适应)
cv2.imshow(“空白屏蔽”,空白屏蔽)
cv2.imshow(“最终”,最终)
cv2.waitKey()

非常感谢,刚刚实现了这个,效果非常好!将不得不调整它以获得理想的分割结果,但这比我要求的要多得多。如果你只想获得大静脉,你可以使用
(3,3)
内核先进行变形打开,然后进行变形关闭。它应该去除微小的颗粒,但保留主静脉