我尝试填充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')
答案 0 :(得分:1)
问题是conv2
在图片上使用了零填充,因此当您执行卷积时,由于您使用了'same'
参数,因此您的图像周围会出现“边框” 。
此边框在您的阈值图像中全部为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');
使用这些方法中的任何一种,您的输出都会像我预期的那样。