通过周围像素的平均值移除图像中的孔

时间:2012-07-05 05:18:47

标签: matlab image-processing computer-vision interpolation

Gray Scale Image with Holes

任何人都可以帮助我用相邻非零像素的值填充这些黑洞。 感谢

3 个答案:

答案 0 :(得分:8)

这样做的一个好方法是解决linear heat equation。你所做的是修复好区域中像素的“温度”(强度),让热量流入坏像素。一个可通过但有点慢的方法是重复对图像进行平均,然后使用newImage(~badPixels) = myData(~badPixels);将好像素设置回原始值。

我执行以下步骤:

  1. 找出图像为零的坏像素,然后扩大以确保我们得到所有内容
  2. 应用大模糊让我们更快开始
  3. 平均图像,然后将好像素设置回原来的
  4. 重复步骤3
  5. 显示
  6. 您可以重复平均,直到图像停止变化,并且您可以使用较小的平均内核以获得更高的精度 - 但这会产生良好的结果:

    enter image description here

    代码如下:

    numIterations = 30;
    avgPrecisionSize = 16; % smaller is better, but takes longer
    
    % Read in the image grayscale:
    originalImage = double(rgb2gray(imread('c:\temp\testimage.jpg')));
    
    % get the bad pixels where  = 0 and dilate to make sure they get everything:
    badPixels = (originalImage == 0);
    badPixels = imdilate(badPixels, ones(12));
    
    %# Create a big gaussian and an averaging kernel to use:
    G = fspecial('gaussian',[1 1]*100,50);
    H = fspecial('average', [1,1]*avgPrecisionSize);
    
    %# User a big filter to get started:
    newImage = imfilter(originalImage,G,'same');
    newImage(~badPixels) = originalImage(~badPixels);
    
    % Now average to
    for count = 1:numIterations
       newImage = imfilter(newImage, H, 'same');
       newImage(~badPixels) = originalImage(~badPixels);
    end
    
    %% Plot the results
    figure(123);
    clf;
    
    % Display the mask:
    subplot(1,2,1);
    imagesc(badPixels);
    axis image
    title('Region Of the Bad Pixels');
    
    % Display the result:
    subplot(1,2,2);
    imagesc(newImage);
    axis image
    set(gca,'clim', [0 255])
    title('Infilled Image');
    
    colormap gray
    

    但是您可以使用图像处理工具箱中的roifill来获得类似的解决方案,如下所示:

    newImage2 = roifill(originalImage, badPixels);
    
    figure(44);
    clf;
    imagesc(newImage2);
    colormap gray
    

    注意我使用的是之前定义的相同badPixels。

答案 1 :(得分:5)

Matlab文件交换上有一个文件, - inpaint_nans完全符合您的要求。作者解释了为什么以及在哪种情况下它优于Delaunay三角测量。

答案 2 :(得分:2)

要填充一个黑色区域,请执行以下操作:

1)识别包含黑色区域的子区域越小越好。最好的情况只是黑洞的边界点。

2)通过以下方式创建子区域内非黑点的Delaunay三角剖分:

 tri = DelaunayTri(x,y); %# x, y (column vectors) are coordinates of the non-black points.

3)通过以下方式确定Delaunay三角形的黑点:

[t, bc] = pointLocation(tri, [x_b, y_b]); %# x_b, y_b (column vectors) are coordinates of the black points
tri = tri(t,:);

4)插值:

v_b = sum(v(tri).*bc,2); %# v contains the pixel values at the non-black points, and v_b are the interpolated values at the black points.