问题与imfill - Matlab

时间:2017-01-28 16:08:22

标签: matlab image-processing

我尝试填充BW2中的对象,但我得到的是完全白色的图像。为什么会这样?

clc;
clear;
grayImage =  rgb2gray(imread('https://i.stack.imgur.com/afCDL.jpg'));

gaussian1 = fspecial('Gaussian', 15, 10);
gaussian2 = fspecial('Gaussian', 15, 200);
dog = gaussian1 - gaussian2;
dogFilterImage = conv2(double(grayImage), dog, 'same');

I=im2uint8(dogFilterImage); 
T = adaptthresh(I, 0.4);
BW = imbinarize(I,T);

imshowpair(I, BW, 'montage')

BW2 = bwareaopen(BW, 3000);
BW2 = imfill(BW2,'holes');
imshow(BW2)
title('Filled Image')

1 个答案:

答案 0 :(得分:1)

问题是conv2在图片上使用了零填充,因此当您执行卷积时,由于您使用了'same'参数,因此您的图像周围会出现“边框” 。

enter image description here

此边框在您的阈值图像中全部为1,导致imfill完全填充您的图像。

一种选择是使用'valid'输入到conv2,而不会在卷积之前省略受零填充影像影响的任何像素

dogFilterImage = conv2(double(grayImage), dog, 'valid');

另一个选项是使用零以外的值显式填充图像。您可以使用padarray执行此操作。

padded = padarray(double(grayImage), [8 8], 'replicate', 'both');
dogFilterImage = conv2(double(grayImage), dog, 'valid');

使用这些方法中的任何一种,您的输出都会像我预期的那样。

enter image description here