在图像的特定部分应用高斯分布

时间:2014-04-28 22:14:26

标签: matlab

我有以下图片和相应的面具。

enter image description here enter image description here

我想用高斯g = @(x,y,xc,yc) exp(-( ((x-xc)^2)/0.5 + ((y-yc)^2)/0.5 ));来加权白色圆圈内的像素,放置在蒙版的centroid (xc,yc)中。 xy是相应像素的坐标。你有没有人可以建议一种方法来做没有使用for循环?

感谢。

1 个答案:

答案 0 :(得分:1)

通过“加权”椭圆内的像素,我假设你的意思是乘以2D高斯的元素。如果是这样,这是代码:

% Read images
img = imread('img.jpg');
img = im2double(rgb2gray(img));
mask = imread('mask.jpg');
mask = im2double(rgb2gray(mask)) > 0.9; % JPG Compression resulted in some noise

% Gaussian function
g = @(x,y,xc,yc) exp(-(((x-xc).^2)/500+((y-yc).^2)./200)); % Should be modified to allow variances as parameters

% Use rp to get centroid and mask
rp_mask = regionprops(mask,'Centroid','BoundingBox','Image');

% Form coordinates
centroid = round(rp_mask.Centroid);
[coord_x coord_y] = meshgrid(ceil(rp_mask.BoundingBox(1)):ceil(rp_mask.BoundingBox(1))+rp_mask.BoundingBox(3)-1, ...
                             ceil(rp_mask.BoundingBox(2)):ceil(rp_mask.BoundingBox(2))+rp_mask.BoundingBox(4)-1);

% Get Gaussian Mask
gaussian_mask = g(coord_x,coord_y,centroid(1),centroid(2));
gaussian_mask(~rp_mask.Image) = 1; % Set values outside ROI to 1, this negates weighting outside ROI

% Apply Gaussian - Can use temp variables to make this shorter
img_g = img;
img_g(ceil(rp_mask.BoundingBox(2)):ceil(rp_mask.BoundingBox(2))+rp_mask.BoundingBox(4)-1, ...
     ceil(rp_mask.BoundingBox(1)):ceil(rp_mask.BoundingBox(1))+rp_mask.BoundingBox(3)-1) =  ...
     img(ceil(rp_mask.BoundingBox(2)):ceil(rp_mask.BoundingBox(2))+rp_mask.BoundingBox(4)-1, ...
     ceil(rp_mask.BoundingBox(1)):ceil(rp_mask.BoundingBox(1))+rp_mask.BoundingBox(3)-1) .* gaussian;

% Show
figure, imshow(img_g,[]);

结果:

enter image description here

如果您想在该roi中执行某些过滤,则会有一个名为roifilt2的函数,它允许您过滤该区域内的图像:

img_filt = roifilt2(fspecial('gaussian',[21 21],10),img,mask);
figure, imshow(img_filt,[]);

结果:

enter image description here