Matlab 图像的邻域和块操作
图像的邻域操作是指输出图像的像素点取值,由输入图像的某个像素点及其邻域内的像素,通常像素点的邻域是一个远小于图像本身尺寸、形状规则的像素块,如2
通用滑块邻域操作函数:
nlfilter()
,语法包括:B = nlfilter(A, [m n], fun)
:输入灰度图像A
,返回图像B
,按照尺寸m
× n
滑动邻域,利用运算函数fun
处理后得到结果。其中fun
是一个传入m
× n
矩阵输出一个标量的函数,可以是mean
,mean2
,std
,std2
,min
,max
等Matlab自带的函数,或者使用inline
自定义的函数。B = nlfilter(A, 'indexed', ...)
:该函数中返回图像B
,它是输入的索引图像A
填充后的结果。如图像A
的数据类型是浮点型,则用”1”填充;如果是逻辑型或者无符号整型,则用 “0”填充。
以lena图为例:
lena.jpg
clc; clear all; close all;
A = imread('lena.jpg');
A1 = im2double(A);
B1 = nlfilter(A1, [4 4], 'std2');
fun = @(x) max(x(:));
B2 = nlfilter(A1, [3 3], fun);
B3 = nlfilter(A1, [6 6], fun);
figure(1);
subplot(1, 3, 1), imshow(B1);
subplot(1, 3, 2), imshow(B2);
subplot(1, 3, 3), imshow(B3);
- 分离邻域操作函数:
blockproc()
,语法包括:
B = blockproc(A, [m n], fun)
:该函数中对输入图像A
,采用尺寸m
× n
分离块,利用运算函数fun
处理,处理后的结果为输出图像B
。B = blockproc(src_filename, [m n], fun)
:与上面函数的语法相似,但是同时读取和处理名为src_filename
的图像,处理时将图像的一个分块读入内存,这个调用方式对于大图像非常有效,如果输出矩阵B
过大,则可以使用参数Destination
,将处理结果直接写入该文件中。B = blockproc(adapter, [M N], fun)
:用于处理用户自己定义的图像格式,adapter
是读写图像的接口函数。blockproc(..., Name, Value, ...)
:该函数中按照Name-Value
的方式对于像进行分离块处理,Name-Value
取值可以查找Matlab的help文档。
其中关于块的一些定义如下:
变量 | 含义 |
---|---|
block_struct.border |
是一个两元素向量[V H] ,说明矩阵的垂直和水平结构 |
block_struct.blockSize |
是一个两元向量[rows cols] 说明块的尺寸 |
block_struct.data |
是一个M N 或 M N P 的矩阵 |
block_struct.imageSize |
是一个两元向量[row col] 说明输入图像的尺寸 |
block_struct.location |
是一个两元向量[row col] 说明输入图像的块数据中第一像素的位置 |
I = imread('peppers.png');
fun = @(block_struct) block_struct.data(:,:,[2 1 3]);
blockproc(I, [64 64], fun, 'Destination', 'grb_peppers.tif');
subplot(1, 2, 1), imshow(I);
subplot(1, 2, 2), imshow('grb_peppers.tif');
peppers.png(图左),grb_peppers.tif(图右)
- 列方向邻域操作函数:
colfilt()
,语法包括:
B = colfilt(A, [m n], block_type, fun)
:该函数中将输入图像A
,按照尺寸m
× n
块重新组合成一个临时矩阵,利用fun
函数对这个临时矩阵处理,如果需要填充,则使用“0”填充。其中block_type
是个字符串,可以取distinct
或sliding
,取distinct
按照分离邻域的方式B = colfilt(A, [m n], [mblock nblock], block_type, fun)
B = colfilt(A, 'indexed', ...)