Image 检测图像中重复的像素模式,并使用matlab将其删除

Image 检测图像中重复的像素模式,并使用matlab将其删除,image,matlab,image-processing,normalization,pattern-recognition,Image,Matlab,Image Processing,Normalization,Pattern Recognition,我使用的是Matlab R2017a,我有一个RGB图像TIFF 128x128 uint16,如下所示为png图像: 实际TIFF图像: 如上图所示,有一个非常浅的黄色和浅蓝色像素的重复模式。因为我使用的是像素数据,所以真正亮的像素会扭曲我的图形,所以我想中和它们。我到处找,但找不到清晰的模式识别/删除命令集,因此我最终找到了图像中的行,其中有10多个像素,强度值>1036,共有19行。从那里,我找到了这些最亮像素出现的索引,并将它们存储在一个19个单元的数组中——cellarray{}。我可

我使用的是Matlab R2017a,我有一个RGB图像TIFF 128x128 uint16,如下所示为png图像:

实际TIFF图像:

如上图所示,有一个非常浅的黄色和浅蓝色像素的重复模式。因为我使用的是像素数据,所以真正亮的像素会扭曲我的图形,所以我想中和它们。我到处找,但找不到清晰的模式识别/删除命令集,因此我最终找到了图像中的行,其中有10多个像素,强度值>1036,共有19行。从那里,我找到了这些最亮像素出现的索引,并将它们存储在一个19个单元的数组中——cellarray{}。我可以通过运行ImageRay{n}得到那些最亮的像素值,其中n从1到19

从这里,我想通过取上面和下面正常像素的平均值来中和这些超亮像素。但是如果它与另一个非常明亮的像素相邻,我希望它的新像素值是最接近的正常像素的平均值。我希望这是有道理的。。。
有人能帮我写代码或者建议一个更简单的方法吗?非常感谢

提出了两种方法,一种使用互相关,另一种使用亮度。它们可以处理灰度和多波段图像。你应该稍微调整一下设置以提高效果

重要提示:fillmissing需要Matlab 2016b或更新版本

使用互相关的方法A 这是通过提取模式的单个引用并在图像上找到相关性非常高的位置来实现的。虽然它比方法B提供更好的结果,但它也更复杂,需要更多关于您正在做什么的知识:

I = double(yourimage);
% Show image
imagesc(I)
% You have to select a part of single occurrence of the pattern (a template) on the image! See below image.
rect = round(getrect);
% In case it is a multiband image make grayscale image
if size(I,3)>1
    BW = rgb2gray(I);
else
    BW = I;
end
% Extract template from BW
template = BW(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
% Show template - this is the extent you selected during "getrect"
imagesc(template)
图像上模板的相关性。请注意,它与下面的亮黄色图案和浅蓝色图案高度相关

它捕获黄色和浅蓝色图案,但也捕获一些假阳性。您必须使用不同的模板、截止值、膨胀半径和中值滤波器大小进行实验,以改进结果

使用图像亮度的方法B 有点离题,因为没有使用模式识别,而是黄色模式非常明亮。但由于结果并不太糟糕,而且简单得多,我觉得它可能有用。更容易避免发现误报

% I = your image
I = double(I);

% get indexes where very bright in red channel
idx = cdata(:,:,1)>157; % 157 = brightest non-pattern pixel in your image

% From now on same as end from method A)!
% dilate the idx to also get the adjacent pixels because else too few pixels will be erased
idx = imdilate(idx,strel('disk',1));
% replacate them if multiband image. Does nothing if only grayscale image
idx = repmat(idx,1,1,size(I,3));
% replace pattern pixels with NaN
I(idx) = NaN;
% fill Nan values using 50x50 median filter
I = fillmissing(I,'movmedian',[50 50]);
% display new image
figure; imagesc(I)

提出了两种方法,一种使用互相关,另一种使用亮度。它们可以处理灰度和多波段图像。你应该稍微调整一下设置以提高效果

重要提示:fillmissing需要Matlab 2016b或更新版本

使用互相关的方法A 这是通过提取模式的单个引用并在图像上找到相关性非常高的位置来实现的。虽然它比方法B提供更好的结果,但它也更复杂,需要更多关于您正在做什么的知识:

I = double(yourimage);
% Show image
imagesc(I)
% You have to select a part of single occurrence of the pattern (a template) on the image! See below image.
rect = round(getrect);
% In case it is a multiband image make grayscale image
if size(I,3)>1
    BW = rgb2gray(I);
else
    BW = I;
end
% Extract template from BW
template = BW(rect(2):rect(2)+rect(4),rect(1):rect(1)+rect(3),:);
% Show template - this is the extent you selected during "getrect"
imagesc(template)
图像上模板的相关性。请注意,它与下面的亮黄色图案和浅蓝色图案高度相关

它捕获黄色和浅蓝色图案,但也捕获一些假阳性。您必须使用不同的模板、截止值、膨胀半径和中值滤波器大小进行实验,以改进结果

使用图像亮度的方法B 有点离题,因为没有使用模式识别,而是黄色模式非常明亮。但由于结果并不太糟糕,而且简单得多,我觉得它可能有用。更容易避免发现误报

% I = your image
I = double(I);

% get indexes where very bright in red channel
idx = cdata(:,:,1)>157; % 157 = brightest non-pattern pixel in your image

% From now on same as end from method A)!
% dilate the idx to also get the adjacent pixels because else too few pixels will be erased
idx = imdilate(idx,strel('disk',1));
% replacate them if multiband image. Does nothing if only grayscale image
idx = repmat(idx,1,1,size(I,3));
% replace pattern pixels with NaN
I(idx) = NaN;
% fill Nan values using 50x50 median filter
I = fillmissing(I,'movmedian',[50 50]);
% display new image
figure; imagesc(I)

为了澄清,您想删除黄色条纹和蓝色镜像图案(黄色条纹下面有一点)?只有黄色的要容易得多,而其他的可能不会对你的图表造成太多的干扰。现在,如果只去掉黄色条纹图案,我会非常高兴的!谢谢为了澄清,您想删除黄色条纹和蓝色镜像图案(黄色条纹下面有一点)?只有黄色的要容易得多,而其他的可能不会对你的图表造成太多的干扰。现在,如果只去掉黄色条纹图案,我会非常高兴的!谢谢哇-这太棒了。非常感谢你抽出时间来帮助我。我的原始图像是TIFF格式的,这不适用于此代码。我可以将tiff转换为png,但我担心会丢失重要信息。要使代码适用于TIFF RGB文件,我必须修改哪些内容?再次感谢你,这太棒了!顺便说一句,我的TIFF文件是128x128 uint16:没问题,随时乐意帮助。我同意,你不应该转换它,你能把.tiff文件上传到某个地方吗?我有tiff文件,但是堆栈溢出不允许我把它上传到我的问题中。有没有别的地方我可以上传给你看?非常感谢!嗨,谢谢你!我刚刚把tiff文件上传到这里:哇,这太棒了。
非常感谢你抽出时间来帮助我。我的原始图像是TIFF格式的,这不适用于此代码。我可以将tiff转换为png,但我担心会丢失重要信息。要使代码适用于TIFF RGB文件,我必须修改哪些内容?再次感谢你,这太棒了!顺便说一句,我的TIFF文件是128x128 uint16:没问题,随时乐意帮助。我同意,你不应该转换它,你能把.tiff文件上传到某个地方吗?我有tiff文件,但是堆栈溢出不允许我把它上传到我的问题中。有没有别的地方我可以上传给你看?非常感谢!嗨,谢谢你!我刚刚在这里上传了tiff文件: