在处理的图像伪影(artifacts in processed images)

2019-07-29 21:25发布

这个问题关系到我以前的帖子图像处理算法在Matlab中的计算器,我已经得到了我想要的结果。

但是现在我面临的另一个问题,并获得在处理图像的一些文物。 在我的原始图像(600个图像的堆栈)我看不到任何文物,请参阅从指甲原始图像:

但在我10分处理的结果,我可以看到这几行:

我真的不知道是哪里来的?

另外,如果他们属于相机的传感器为什么我不能看到他们在我原来的图像? 任何的想法?

编辑:

我已经加入由@Jonas建议下面的代码。 它减少了人工制品,但不能完全删除它们。

%averaging of images
im = D{1}(:,:);
for i = 2:100
 im = imadd(im,D{i}(:,:));
end
im = im/100;
imshow(im,[]);

for i=1:100
SD{i}(:,:)=imsubtract(D{i}(:,:),im(:,:))
end

@belisarius已要求更多的图像,所以我要上传我的手指与斑点图案4个图像和黑色的背景尺寸(1280×1024)4个图像:

这里是黑色背景:

Answer 1:

这里有一个答案,在意见将更加温和地去除线比上面提到的方法:

im = imread('image.png');   % Original image
imFiltered = im;            % The filtered image will end up here
imChanged = false(size(im));% To document the filter performance 

% 1)
% Compute the histgrams for each column in the lower part of the image
% (where the columns are most clear) and compute the mean and std each
% bin in the histogram.
histograms = hist(double(im(501:520,:)),0:255);
colMean = mean(histograms,2);
colStd = std(histograms,0,2);

% 2)
% Now loop though each gray level above zero and...
for grayLevel = 1:255

    % Find the columns where the number of 'graylevel' pixels is larger than
    % mean_n_graylevel + 3*std_n_graylevel). - That is columns that contains
    % statistically 'many' pixel with the current 'graylevel'. 
    lineColumns = find(histograms(grayLevel+1,:)>colMean(grayLevel+1)+3*colStd(grayLevel+1));

    % Now remove all graylevel pixels in lineColumns in the original image
    if(~isempty(lineColumns))
        for col = lineColumns 
            imFiltered(:,col) = im(:,col).*uint8(~(im(:,col)==grayLevel));
            imChanged(:,col) = im(:,col)==grayLevel;
        end
    end 
end

imshow(imChanged)
figure,imshow(imFiltered)

这里是滤波后的图像

这说明受滤波器的像素



Answer 2:

您的工件实际上存在于你的原始图像,虽然不可见。 在代码数学:

i = Import@"http://i.stack.imgur.com/5hM3u.png"

EntropyFilter[i, 1]

该线是微弱的,但是你可以通过二值化水平非常低门槛看到他们:

Binarize[i, .001] 

至于是什么原因导致他们,我只能猜测。 我将开始从相机输出本身跟踪。 此外,您可以张贴两个或三个图像“因为他们来直接从相机”让我们一些试验。



Answer 3:

您正在使用的相机是最有可能有一个CMOS芯片。 因为他们有独立柱(也可能是行)放大器,它可能略有不同的电子特性,可以从比另一个更放大一列得到信号。

根据相机的不同,这些变异列强度可以是稳定的。 在这种情况下,你很幸运:取〜100幅暗的图像(带东西在镜头上),取它们的平均值,然后在运行分析之前,从每个图像相减。 这应该使线消失。 如果线路不消失(或者有其他行),可以使用由荷银提出的后处理方案二值化后删除线。

编辑

这里是你会怎么做背景减法,假设你已经采取100幅深色图像,并将它们存储在单元阵列D与100个元素:

% take the mean; convert to double for safety reasons
meanImg = mean( double( cat(3,D{:}) ), 3); 

% then you cans subtract the mean from the original (non-dark-frame) image
correctedImage = rawImage - meanImg; %(maybe you need to re-cast the meanImg first)


Answer 4:

你可以使用某种形态 开放 ,以除去细的垂直线:

img = imread('image.png');
SE = strel('line',2,0);
img2 = imdilate(imerode(img,SE),SE);

subplot(121), imshow(img)
subplot(122), imshow(img2)

所使用的结构化元素是:

>> SE.getnhood
ans =
     1     1     1


Answer 5:

没有真正挖掘到你的图像处理,我能想到的原因,要做到这一点二:

  1. 处理引入这些伪影。 这是不可能的,但它是一个选项。 检查你的算法和代码。

  2. 这是一个副作用,因为你的处理,减少了图像的动态范围,就像量化。 所以,事实上,这些文物可能已经在处理本身之前的图片,但他们可能不会被察觉,因为他们的水平非常接近背景水平。 至于这些文物的来源,它甚至可能是相机本身。



Answer 6:

这是一个非常有趣的问题。 我用来对付这种类型的问题,现场红外成像器(视频系统)。 实际上,我们已经内置到相机算法处理之前曾经看到或得到他们的手在图像上的用户的问题。 夫妇的问题:

1)你在处理RAW图像或者是你处理已经预先处理灰度(或RGB)的图像?

2)你有什么用这些图像的最终目标。 是我们的目标简单地摆脱了线的不管质量的导致,或者是保持绝对的最佳图像质量的点图像的其余部分。 你在事后进行其他处理?

我同意这些线是最有可能在所有的图片。 有2个原因,这些线路曾经显示的图像时,一个是在明亮场景中列的运算放大器得到饱和,从而导致图像的全列得到最亮值相机可以输出。 另一个原因可能是坏的运算放大器或模数转换器(模数转换器)本身(最有可能不是一个ADC为常存在本质上是1个ADC对日整个传感器,这将使整个图像不好,不是你的情况下)。 饱和的情况下实际上是更加难以对付(我不认为这是你的问题)。 注:在传感器上过多的饱和可能会导致坏像素和列在您的传感器出现(这就是为什么他们说从来没有对准太阳你的相机)。 坏列问题可以解决。 上面另一个答案,有人有你的平均图像。 虽然这可能是好的,找出坏列(或坏的单个像素,或者你的传感器的噪声矩阵)是(你将不得不平均将摄像机对准黑,白,基本上是实心的颜色),它不是” t时的正确答案摆脱他们。 顺便说一句,我所用的黑白和平均解释,并找出坏像素,等等......被称为校正您的传感器。

好了,说你能得到这个校准数据,那么你就可以找出哪些列是不好的,甚至单一像素。

如果你有这样的数据,一个办法,你可以删除列,具体是:

for each bad column
    for each pixel (x, y) on the bad column
        pixel(x, y) = Average(pixel(x+1,y),pixel(x+1,y-1),pixel(x+1,y+1),
                              pixel(x-1,y),pixel(x-1,y-1),pixel(x-1,y+1))

这本质上确实是一个新的像素是它周围的6个其余好象素的平均替换不良像素。 以上是过简化版本的算法的。 当然也有情况下,一个单独坏像素可能是旁边不良列,不应该被用于计算平均值,或两个或三个坏列紧挨着对方。 人们可以想像,你将计算值不良列,然后再考虑该列好,以移动到下一个坏列,等等....

现在,我之所以问了一下RAW还是B / W或RGB。 如果你处理的RAW,取决于传感器本身的构建,它可能是唯一的一个子像素的拜耳过滤的图像传感器(如果你愿意)有坏的运算放大器。 如果你能发现这一点,那么你就不一定要抛出了另一个好子像素的数据。 其次,如果你使用的是RGB传感器,带灰度的照片,你拍它在RAW,那么你可以计算出你自己的灰度像素。 许多传感器使用RGB传感器时从而给回一灰度图像时,将简单地传回绿像素作为整体像素。 这是由于这样的事实,它真的用作图像的发光。 这就是为什么大多数图像传感器实现2个绿色的子像素,每R或G亚像素。 如果这是他们在做什么(不是所有的传感器做到这一点),那么你可以有更好的运气摆脱只是坏频道栏目,并使用执行自己的灰度转换。

gray = (0.299*r + 0.587*g + 0.114*b)

在很长的解释道歉,但我希望这仍然是信息的人:-)



Answer 7:

既然你不能看到原始图像中的线条,他们要么有低强度差别比较原始范围图像,或者通过你的处理算法增加。

干扰的形状提示第一个选项...(除非你有单独处理每一行的算法。)

好像你的传感器的列不统一,请尝试使用相同的曝光(和其他)设置拍照没有手指(仅背景),然后从手指的照片(早于其他处理)中减去。 (确保背景是采取两个图像之前统一。)



文章来源: artifacts in processed images