MATLAB--图像的邻域和块操作

图像的邻域操作

图像的邻域操作是指输出图像的像素点取值决定于输入图像的某个像素点及其邻域内的像素。
邻域操作根据邻域的类型又可分为滑动邻域操作和分离邻域操作。

1、通用滑动邻域操作函数nlfilter()

调用格式说明
B = nlfilter(A,[m n],fun)输入灰度图像A,按照尺寸为m×n滑动邻域,利用运算函数fun处理后的结果,返回图像B。其中fun可以是向量平均值mean、矩阵平均值mean2、方差向量std、矩阵方差std2、向量最小值min、最大值max、方差var,也可以是自定义函数
B = nlfilter(A,‘indexed’,___)输入索引图像A填充后的结果,如果A的数据类型是逻辑型或无符号整型用“0”填充,如果是浮点型则用“1”填充

MATLAB实现
示例:

rgb=imread('peppers.png');  %Read an rgb image into the workspace.
gray=rgb2gray(rgb);  %Convert the rgb image to gray.
gray=im2double(gray);  %Convert the image to double.

fun=@(x) median(x(:));  %Create the function to apply to the image--a median filter.
m3filter=nlfilter(gray,[3 3],fun);  %Apply the filter to the image which is 3-by-3 pixel neiborhood.
m6filter=nlfilter(gray,[6 6],fun);  %Apply the filter to the image which is 6-by-6 pixel neiborhood.
vfilter=nlfilter(gray,[3 3],'std2');  %Apply the variance of matrix to the image. 

subplot(2,2,1); imshow(gray,[]);  title('Original Image');
subplot(2,2,2); imshow(m3filter,[]); title('3-by-3 Median Filtered Image');
subplot(2,2,3); imshow(m6filter,[]); title('6-by-6 Median Filtered Image');
subplot(2,2,4); imshow(vfilter,[]); title('Variance Filtered Image');

运行结果:
nlfilter

2、列方向邻域操作函数colfilt()

调用格式说明
B = colfilt(A,[m n],block_type,fun)将输入图像A按照尺寸m×n重新组合成一个临时列矩阵,利用函数fun对这个临时列矩阵进行处理,如果需要填充则用“0”对图像A进行填充。其中block_type是字符串,可以取“distinct”或“sliding”,取“distinct”按照分离邻域方式重新组合临时矩阵,处理后返回的矩阵大小必须和临时矩阵相同;取“sliding”表示按照滑动邻域方式重新组合临时矩阵,处理后返回一个行向量,向量中包含临时矩阵中每个行一个单一值
B = colfilt(A,[m n],[mblock nblock],block_type,fun)该函数中的处理与上一种调用方式相同,将图像A细分为mblock×nclock的块区域以节省内存,[mblock nblock] 说明块的存储方式不改变返回操作结果
B = colfilt(A,‘indexed’,___)对索引图像A进行填充,如果是无符号整数则用“0”填充;如果是浮点数则用“1”填充

MATLAB实现
示例:

rgb=imread('peppers.png');
gray=rgb2gray(rgb); 
gray=im2double(gray);
%按照滑动邻域方式对图像进行最小值邻域操作
fun=@(x) min(x);
mfilter1=colfilt(gray,[4 4],'sliding',fun);
%按照分离邻域方式对图像进行最小值邻域操作
m=4;n=4;
fun=@(x) ones(m*n,1)*min(x); %ones(m*n,1)*min(x)是求最小值函数,使用ones(m*n,1)是把每个[m n]的图像变成一个列
mfilter2=colfilt(gray,[m n],'distinct',fun);

m=2;n=2;
fun=@(x) ones(m*n,1)*min(x);
mfilter3=colfilt(gray,[m n],'distinct',fun);

subplot(2,2,1); imshow(gray,[]);  title('Original Image'); 
subplot(2,2,2); imshow(mfilter1,[]); title('sliding 4*4');
subplot(2,2,3); imshow(mfilter2,[]); title('distinct 4*4');
subplot(2,2,4); imshow(mfilter3,[]); title('distinct 2*2');

运行结果:
colfilt

3、分离邻域操作函数blockproc()

调用格式说明
B = blockproc(A,[m n],fun)通过对大小为 [m n] 的每个非重叠图像块应用 fun 函数并将结果串联到输出矩阵 B 中,来处理图像 A。其中fun是函数句柄,该函数必须接受 block_struct 作为输入,并返回矩阵、向量或标量。如果 fun 返回空值,则 blockproc 不会生成任何输出,并且在处理完所有图像块后返回空值。
B = blockproc(src_filename,[m n],fun)利用运算函数fun按照尺寸为m×n的图像块,读取和处理文件名为 src_filename 的图像,一次读取和处理一个图像块。此语法对于处理大型图像很有用。如果输出矩阵也很大,处理后的结果直接写入Destination文件中。
B = blockproc(adapter,[m n],fun)处理由 adapter(一个 ImageAdapter 对象)指定的源图像。
blockproc(___,Name,Value)使用名称-值对组参数来控制图像块行为的各个方面。

MATLAB实现
示例:

I=imread('peppers.png'); %将图像读入工作区
%创建图像缩略图
fun=@(block_struct) imresize(block_struct.data,0.2); 
I2=blockproc(I,[50 50],fun);
%将50×50图像块中的像素设置为标准差
fun=@(block_struct) std2(block_struct.data); %创建图像块处理的函数句柄
I3=uint8(blockproc(I,[50 50],fun)); %逐块处理图像
%交换RGB图像中的颜色
fun=@(block_struct) block_struct.data(:,:,[3 1 2]); %创建图像块处理的函数句柄
blockproc(I,[50 50],fun,'Destination','brg_peppers.tif');

subplot(2,2,1); imshow(I); title('original image');
subplot(2,2,2); imshow(I2); title('thumbnail');
subplot(2,2,3); imshow(I3); title('variance image');
subplot(2,2,4); imshow('brg_peppers.tif'); title('brg_ peppers.tif');

运行结果:
blockproc
补充:

块结构体中的变量名说明
block_struct. border[v h] 形式的二元素向量。border 字段指定数据块周围垂直和水平填充的大小。
block_struct.blockSize[rows cols] 形式的二元素向量。blockSize 字段指定块数据的大小。如果指定了边框,则大小不包括边框像素。
block_struct.data块数据的 m×n 或 m×n×p 矩阵。
block_struct.imageSize[rows cols] 形式的二元素向量。imageSize 字段指定输入图像的完整大小。
block_struct.location[row col] 形式的二元素向量。location 字段指定输入图像中块数据的第一个像素的位置(最小行最小列)。如果指定了边框,则该位置指离散块数据的第一个像素,而不是添加的边框像素。

图像的区域选取

1、多边形区域选择函数roipoly()

调用格式说明
BW = roipoly(I)显示当前灰度或RGB图像I,并创建与当前图像I相关的交互式多边形ROI区域选择工具
BW = roipoly(I,xi,yi)根据xi和yi返回感兴趣的区域ROI。其中,xi和yi说明感兴趣的多边形各个顶点行列序号,xi和yi两个向量大小相同
BW = roipoly(x,y,I,xi,yi)根据向量x和y建立一个空间坐标系,根据xi和yi在x和y坐标系下定义的多边形顶点选择输入图像I的ROI区域
[BW,xi2,yi2] = roipoly(___)返回x和y坐标系下感兴趣区域的顶点坐标xi和yi

2、灰度ROI区域选择函数roicolor()

调用格式说明
BW = roicolor(I,low,high)返回ROI区域,ROI区域中像素颜色映射范围为[low,high],返回BW是一个二值图像,ROI区域内像素值为1,ROI区域外为0
BW = roicolor(I,v)返回ROI区域,ROI区域中像素和向量v匹配,返回BW是一个二值图像,与向量v匹配的区域内值为1,不匹配区域内值为0

3、区域填充函数regionfill()

调用格式说明
J=regionfill(I,c,r)对向量c和r确定多边形区域进行填充,c和r两个向量大小相同,其中第k个ROI区域顶点坐标为(r(k),c(k))。
J=regionfill(I,mask)用mask作为掩膜图像,填充输入图像I中对应掩膜图像的非零位置。

4、区域滤波函数roifilt2()

调用格式说明
J = roifilt2(h,I,BW)对输入图像I利用二维线性滤波器h进行滤波,BW为二值图像,大小与输入图像I相同,作为掩膜图像用于滤波
J = roifilt2(I,BW,fun)利用函数fun处理输入图像I的数据,结果返回给J,其中BW中对应像素为“1”的位置返回的是计算值,BW中对应位置为“0”的返回输入图像I的相应位置值

MATLAB实现
示例:

I=imread('peppers.png');     
I=rgb2gray(I);
BW1=roicolor(I,55,100);             %基于灰度图像ROI区域选取
c=[87 171 201 165 79 32 87];
r=[133 133 205 259 259 209 133];    %定义ROI顶点位置
BW=roipoly(I,c,r);                  %根据c和r选择ROI区域
I1=regionfill(I,BW);                %根据生成BW掩膜图像进行区域填充
h=fspecial('motion',20,45);         %创建motion滤波器并说明参数
I2=roifilt2(h,I,BW);                %进行区域滤波
figure;
subplot(1,2,1); imshow(BW1); title('ROI处理结果');
subplot(1,2,2); imshow(BW);  title('ROI位置');
figure;
subplot(1,2,1); imshow(I1);  title('基于ROI的填充效果');
subplot(1,2,2); imshow(I2);  title('基于ROI的滤波效果');

运算结果:
1
2

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值