-2

我正在尝试仅将算法应用于图像的特定区域。我尝试过imfreehand,但至少对我而言,无法使用此功能来做到这一点。

那么,在运行我的代码时,是否有某种方法可以将操作仅应用于图像的某些特定区域MATLAB

谢谢。

4

2 回答 2

2

使用由任何“imroi”函数定义的掩码(包括 imfreehand 和 imellipse),您可以使用 roifilt2 使用给定的过滤器或函数仅过滤 roi。

首先,定义区域:

imshow(I); %display your image
h = imfreehand; % now pick the region
BW = createmask(h); %makes BW mask

然后,通过以下方式之一使用 roifilt2 -

定义一个过滤器并应用它:

H = fspecial('unsharp');
I2 = roifilt2(H,I,BW);`

将给定函数应用于 roi:

I2 = roifilt2(I, BW, 'histeq');

将给定函数应用于 roi,指定参数:

fh = @(I)(histeq(I,5)); %define function
I2 = roifilt2(I, BW, fh); 

最后相当于调用 I2 = hist(I,5); 但仅适用于定义的投资回报率。

预计到达时间:

如果你想在 roi 上调用多个函数,定义你自己的函数可能是最简单的,它接受图像输入(以及可选的其他参数),将适当的过滤器/函数应用于图像,并输出最终图像 -然后,您可以像上面的“histeq”一样调用“myfunc”。

于 2013-08-05T10:00:31.907 回答
0

你可以试试roipoly

这里有一个关于 SO 的例子。

这是一个例子:

img = imread('peppers.jpg');        % loads the image we want to use
[BW,xi,yi] = roipoly(img);          % create a polynomial surrounding region
BW = repmat(uint8(BW),[1,1,3]);     % create mask
selIMG = img.*BW;                   % apply mask to retain roi and set all else to 0
imview(selIMG)

se=strel('disk',3); 
erosion=imerode(selIMG,se); 
result_image=imsubtract(selIMG,erosion);
imview(result_image)

编辑

侵蚀:正如 matlab 文档解释的那样,imerode从周围像素中选择最小值(imdilate相反)。这意味着我的答案中的原始处理不足以用于imerode,最好将选择之外的像素设置为色阶上的最大值,我在这里提供了一个示例,说明如何“手动”执行此操作:

img = imread('peppers.jpg');                        % loads the image we want to use
[BW,xi,yi] = roipoly(img);                          % logical mask which contains pixels of interest
nBW = uint8(~BW);                                   % inverse of logical mask to pick surrounding pixels
surroundingMaxedOut = repmat(255*nBW,[1,1,3]);      % set surrounding pixels to max value
nBW = repmat(nBW,[1,1,3]);                          % make mask with 3 channels to pick surrounding pixels
BW = repmat(uint8(BW),[1,1,3]);                     % make mask with 3 channels to handle RGB
selIMG = img.*BW;                                   % pick the image region of interest
selIMG = selIMG + surroundingMaxedOut;              % final selection with surrounding pixels maxed out
imview(selIMG)                                      % inspect the selection


se=strel('disk',3); 
erosion=imerode(selIMG,se);                         % apply erosion 
finalIMG = img.*nBW + BW.*erosion;                  % insert eroded selection into the original image
imview(finalIMG)

正如其他答案所示,matlab 具有隐式处理这些操作的例程,并且不仅在内存管理方面更有效,但是这个示例为您提供了更多控制,因此您可以看到正在发生的事情。

于 2013-08-05T08:32:52.263 回答