我正在尝试将算法仅应用于图像的特定区域。我尝试了imfreehand
,但至少对我来说,不能使用此功能来做到这一点。
那么,运行我的代码是否有某种方法可以将操作仅应用于MATLAB
中图像的某个特定区域?
感谢。
答案 0 :(得分: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。
ETA:
如果你想在roi上调用多个函数,最简单的方法是定义你自己的函数,它接受图像输入(以及可选的其他参数),将适当的滤波器/函数应用于图像,并输出最终图像 - 然后你将以与上面的“histeq”相同的方式调用“myfunc”。
答案 1 :(得分:0)
您可以尝试roipoly。
有一个关于SO here的例子。
以下是一个例子:
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)
修改强>
On erode:作为matlab doc explains,imerode
从周围像素中选择最低值(imdilate
则相反)。这意味着我的答案中的原始处理对imerode
来说是不合适的,最好将选择范围外的像素设置为色阶上的最大值,我在这里提供一个如何“手动”执行此操作的示例:< / p>
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具有隐式处理这些操作的例程,并且在内存管理方面效率更高,但是这个示例为您提供了更多控制,以便您可以看到正在发生的事情。