这是MichaelTr7's answer 的简单替代方案。我们不是仅在图像区域上应用模糊,而是将其应用到整个图像(无论如何这很便宜),然后剪下一部分模糊结果粘贴到原始图像中。一般来说,这可以更好地表示框边缘的模糊:
img = rgb2gray(imread('peppers.png'));
out = floutage(img,120,250,180,310);
imshow(out);
function img = floutage(img, XA, YA, XB, YB)
% Filter the whole image
H = fspecial('average', [11 11]);
blur = imfilter(img, H);
% Write blurry box into image
img(YA:YB, XA:XB) = blur(YA:YB, XA:XB);
end
这种方法的一个优点是它直接导致了一种避免模糊框锐利边缘的方法:应用羽毛。这是一种实现方式:
function img = floutage2(img, XA, YA, XB, YB)
% We'll be working with doubles
img = double(img);
% Filter the whole image
H = fspecial('average', [11 11]);
blur = imfilter(img, H);
% Create mask
mask = zeros(size(blur));
mask(YA:YB, XA:XB) = 1;
mask = imfilter(mask, H);
% Write blurry box into image by weighting with mask
img = blur .* mask + img .* (1 - mask);
% Convert back to uint8
img = uint8(img);
end