1实验思路
我的想法是,拿出来,放进去。也就是把要处理的区域,拿出来,然后进行中值滤波,再放回原来的位置。
1中值滤波
中值滤波的相关知识网上很多,在此不再赘述。
仅介绍一下语法:
medfilt2(img,[n,n]);
注:img:要处理的图片
n为滤波器的大小
2切片ginput
[x1,y,button] = ginput(2);
注: 用鼠标取两个点,两点的x,y坐标分别记录在x1,y中,需注意的是x1,y均为n*1的向量,在此n=2。button可有可无。
3读某行某列
1:读取所有行所有列–直接键入 a或a(:😅
2: 读取前 i 行,前 j 列。键入a( 1:i, 1:j) 其中括号内,行列以逗号隔开,逗号前的控制行,逗号后的控制列
比如说读取矩阵a的前两行两列,键入a(1:2,1:2)
3:读取指定的第 i 行,第j 列–直接键入a(i , j)
4: 读取每一行,第j 列,键入a(:,j) 其中括号内的 :表示所有行,换言之读取第i行的所有列,键入a(i , :)即可
5:读取指定几行的指定几列,就要用上 “ [ ] ”了。读取第 i2、i4 行,第j3、j4列,键入a([2,4],[3,4]) 其中行列用逗号隔开,逗号前的 [ ] 内输入要读取的行,逗号后的 [ ] 内输入要读取的列。
[x1,y,button] = ginput(2);
roi=x(x1(1,1):x1(2,1),y(1,1):y(2,1));
4实验代码
clc
close all
clear all
x=imread('gift.tif');
x=im2double(x);
figure(1);
imshow(x);
[x1,y,button] = ginput(2);
roi=x(x1(1,1):x1(2,1),y(1,1):y(2,1));
roi_filt = medfilt2(roi,[10,10]);
newI = x;
newI(x1(1,1):x1(2,1),y(1,1):y(2,1)) = roi;
figure(2);
imshow(newI);
需要注意的是,由于我读取的是tif格式的文件,所以要进行对x的im2double操作。
这样操作的最大优势在于,可以节约找位置的时间,如果你的图像很大的话,直接通过交互式的截取来完成对图像的切片。