图像处理中的掩膜和使用掩膜提取ROI

一、掩膜的概念

在数字图像处理中,掩膜可以理解为用选定的图像、图形或物体,对处理图像的全部或局部进行遮挡,来控制图像处理的区域或处理过程

二、掩膜的用法

  • 提取兴趣区:使用预先制作的兴趣区掩膜与待处理图像相乘,得到兴趣区图像。兴趣区内的像素值保持不变,兴趣区外的像素值都为0(即显示黑色)。

  • 屏蔽作用:使用掩膜对图像上某些区域进行屏蔽,使其不参加处理或不参加处理参数的计算,或仅对屏蔽区作处理或统计。

  • 结构特征提取:用相似变量或图像匹配方法检测和提取图像中与掩膜相似的结构特征。

  • 特殊形状图像的制作。

三、实例-使用掩膜提取ROI(感兴趣区域)

1、圆形掩膜矩阵函数

假设矩阵大小为m*n,取矩阵最中间一点为圆心,半径为r=m/2。首先使用meshgrid函数生成矩阵对应的每一个坐标,然后使用circle=x.^2 +y.^2生成代表半径的平方的矩阵,最后使用find函数找到不符合要求的元素,赋值为0即可。

function [masked_im,circ_mask] = circle_mask(im)
% masked_im为掩膜处理后的输出图像
% circ_mask为中间过渡图像
% im为输入的灰度图像
circ_mask=im;  
im_size = size(im);
m = im_size(1);% 灰度图像矩阵的行数
n = im_size(2);% 灰度图像矩阵的列数 

r = min(floor(m/2),floor(n/2));% 生成圆的半径(取行和列一半的最小值,保证图像中可以画下一个圆) 
m1 = -m/2:m/2-1;% 把圆心变到矩阵的中间(坐标系以(0,0)为原点,因为meshgrid的x和y构成坐标系)(注意m1和n1均是一个向量  )  
n1 = -n/2:n/2-1;  
% 先写n1再写m1是因为使用meshgrid函数会使行列对调,且需要保持最后的生成的图像大小与原图像相同
[x,y]=meshgrid(n1,m1);% [X,Y]=meshgrid(x,y),坐标XY表的网格有length(y)个行和length(x)个列.y控制行数,x控制列数.
circle=x.^2+y.^2;% 计算出每一点到圆心的距离的平方  

circ_mask(find(circle>r*r))=0; % 找到圆外的元素,并赋值为0(即显示黑色) 
masked_im  = circ_mask;        % 这就是被遮掩后的图像
end

2、主函数

im=imread('onion.png');% (1)为onion.png,(2)为lighthouse.png均为matlab自带,(3)为grass.png需要自行下载
im = rgb2gray(im); % 将RGB图像转换为灰度图像
subplot(1,2,1),imshow(im);
[masked_im,circ_mask] = circle_mask(im);% 调用制作圆形掩膜矩阵函数
subplot(1,2,2),imshow(masked_im);

3、显示效果

(1)该图像大小是198*135
在这里插入图片描述

(2)该图像大小是480640
在这里插入图片描述
(3)该图像大小是512
512
在这里插入图片描述

参考程序:

close all;
clear all;
clc;
m=198; %矩阵的函数
n=135; %矩阵的列数
r=min(floor(m/2),floor(n/2));   %生成圆的半径
m1=-m/2:m/2-1;   %把圆心变到矩阵的中间(坐标系以(0,0)为原点,因为meshgrid的x和y构成坐标系)
n1=-n/2:n/2-1;
[x,y]=meshgrid(n1,m1);% 先写n1再写m1是因为使用meshgrid函数会使行列对调,且原图像大小为198*135,需要保持最后的生成的图像大小为198*135
circle=x.^2+y.^2;   %计算出每一点到圆心的距离的平方

circ_mask=zeros(m,n);  
circ_mask(find(circle<=r*r))=1;  %找到圆内的元素,并复制为1
circ_mask(find(circle>r*r))=0;   %找到圆外的元素,并复制为0

figure;
imshow(255*circ_mask);

由于刚刚开始学习图像处理,对于很多知识理解不到位。如有错误,恳请指正,任重而道远,慢慢加油!

猜你喜欢

转载自blog.csdn.net/qq_44111805/article/details/126259961