Image processing 噪声图像中的线条检测(不存在时不检测)

Image processing 噪声图像中的线条检测(不存在时不检测),image-processing,line,noise-reduction,Image Processing,Line,Noise Reduction,我曾试图提取非常嘈杂的图像中的暗线,但没有成功。一些提示 第一个示例的当前步骤: 1) :夹限=10,网格大小=(8,8) 2) :尺寸=(5,5) 3) :255-图像 4) :当反转图像0,'holes'),'thin',10); indNaN=find(im==0);im=255 im;im(indNaN)=0; N=N-numel(find(im(:,ceil(m/2))==0); N=ceil(N*0.8);%可能的线路长度 %用中值滤波对图像进行归一化处理 if-direc 背

我曾试图提取非常嘈杂的图像中的暗线,但没有成功。一些提示

第一个示例的当前步骤:

1) :夹限=10,网格大小=(8,8)

2) :尺寸=(5,5)

3) :255-图像

4) :当反转图像<64时

更新 我已经执行了一些预处理步骤来提高测试图像的质量。我调整了我的ROI蒙版,使其上下裁剪(因为它们是低强度的),并添加了照明校正,以便更好地看到线条。以下是当前图片:


即使图像有噪声,您也只能在图像的北面寻找直线。那么,为什么不使用某种匹配滤波器进行形态学运算呢

编辑:我已经修改过了

1) 沿x轴和y轴使用中值滤波,并对图像进行规格化。 2) 具有所有可能的线方向的匹配滤波器

% im=imread('JwXON.png');
% im=imread('Fiy72.png');
% im=imread('Ya9AN.png');
im=imread('OcgaIt8.png');

imOrig=im;

matchesx = fl(im, 1);
matchesy = fl(im, 0);

matches = matchesx + matchesy;

[x, y] = find(matches);

figure(1);
imagesc(imOrig), axis image
hold on, plot(y, x, 'r.', 'MarkerSize',5)
colormap gray


%----------

function matches = fl(im, direc)

if size(im,3)~=1
    im = double(rgb2gray(im));
else
    im=double(im);
end
[n, m] = size(im);

mask = bwmorph(imfill(im>0,'holes'),'thin',10);
indNaN=find(im==0); im=255-im; im(indNaN)=0;

N = n - numel(find(im(:,ceil(m/2))==0));
N = ceil(N*0.8); % possible line length

% Normalize the image with median filter
if direc
    background= medfilt2(im,[1,30],'symmetric');
    thetas = 31:149;
else
    background= medfilt2(im,[30,1],'symmetric');
    thetas = [1:30 150:179];
end

normIm = im - background;
normIm(normIm<0)=0;

% initialize matched filter result
matches=im*0;

% search for different angles of lines
for theta=thetas
    normIm2 = imclose(normIm>0,strel('line',5,theta));
    normIm3 = imopen(normIm2>0,strel('line',N,theta));
    matches = matches + normIm3;
end

% eliminate false alarms
matches = imclose(matches,strel('disk',2));
matches = matches>3 & mask;
matches = bwareaopen(matches,100);
%im=imread('JwXON.png');
%im=imread('Fiy72.png');
%im=imread('Ya9AN.png');
im=imread('OcgaIt8.png');
imOrig=im;
matchex=fl(im,1);
matchesy=fl(im,0);
匹配=匹配ESX+匹配SY;
[x,y]=查找(匹配项);
图(1);
imagesc(imOrig),轴图像
等等,绘图(y,x,'r','MarkerSize',5)
彩色地图灰色
%----------
函数匹配=fl(im,direc)
如果尺寸(im,3)~=1
im=双色(rgb2gray(im));
其他的
im=双(im);
结束
[n,m]=尺寸(im);
掩模=bwmorph(imfill(im>0,'holes'),'thin',10);
indNaN=find(im==0);im=255 im;im(indNaN)=0;
N=N-numel(find(im(:,ceil(m/2))==0);
N=ceil(N*0.8);%可能的线路长度
%用中值滤波对图像进行归一化处理
if-direc
背景=medfilt2(im,[1,30],“对称”);
θ=31:149;
其他的
背景=medfilt2(im,[30,1],“对称”);
θ=[1:30150:179];
结束
normIm=im-背景;
normIm(normIm0,strel('line',5,theta));
normIm3=imopen(normIm2>0,strel('line',N,θ));
匹配项=匹配项+正常值3;
结束
%消除假警报
匹配=imclose(匹配,strel('disk',2));
匹配=匹配>3&屏蔽;
matches=BWAREOPEN(匹配,100);


提供有关您的方法的更多信息。什么有效,什么无效。当然,@m3h0w。我当前的步骤:1):使用clip_limit=10和grid_size=(8,8)2):使用size=(5,5)3)4):当反转图像<64时,我想使用RANSAC检测暗线,但我需要在这一步之前“清理”图像。你应该更新问题,最好提供一些结果图像。我改进了问题。Hi@Ozcan,这是一个很好的解决办法。谢谢你的回复,但如果这条线与图像查看器垂直,我们如何才能检测到它呢?沿y轴使用中值滤波器?是的,必须沿y轴使用中值滤波器。但是for循环中的θ值也需要更改。如果您提供一个示例图像,我可以安排代码。@RômuloCerqueira,我修改了我的答案。不过请记住,这只是一个想法,在某些情况下可能不起作用。谢谢,@Ozcan。你的想法真的很有用。嗨,有没有更好的方法找到线路并避免误报率?