赞
踩
imread与imshow函数
- clc;clear; close all;
- I = imread('pout.tif');
- imshow(I);
结果:
如果我们想显示图像坐标轴的话只需在imshow后加上下面这行代码:
set(gca,'Visible','on');
我们还可以用whos命令查看图像的信息:
在命令行窗口输入whos I查看上面那种图片的信息:
显示图像的直方图用hist函数,将直方图均衡化用histeq函数
我们在上述代码基础上继续输入下面代码:
- figure();
- imhist(I);
结果:
可以看到图像的对比度比较低,我们进行直方图均衡,继续输入下面代码:
- I2 = histeq(I);
- imshow(I2);
- figure();
- imhist(I2);
结果:
我们使用imwrite函数将上述均衡化的图像I2写入磁盘:
imwrite(I2, 'output.png');
可以看到左侧文件区多了output.png
我们在命令行窗口使用imfinfo函数能看见该图片更为详细的信息:
拓展:
使用montage函数能一次显示多张图片在一个窗口,并且这些图像不需要是同一尺寸和大小,我们只需要将在当前目录下或已经在matlab路径里的图片的名字放在一个字典里:
运行下面代码:
- clc;clear; close all;
- files = {'catdog.jpg', 'jiedao.jfif', 'Fig0638(a)(lenna_RGB).tif', 'output.png', 'Fig0335(a)(ckt_board_saltpep_prob_pt05).tif'};
- montage(files)
结果:
我们甚至可以看到不是同一类型的(灰度图和RGB图)都能一起展示!
在MATLAB的官方文档里有着这么几个图像类型转换的函数:
我们选择几个常用的讲解:
代码:
- clc;clear; close all;
- RGB = imread('example.tif');
- figure;
- imshow(RGB);
- I = im2gray(RGB);
- figure;
- imshow(I);
结果:
im2gray
函数与 rgb2gray
基本相同,不同之处是它可以接受灰度图像作为输入并原样返回它们。如果输入图像是灰度图像,则 rgb2gray
函数返回错误。
代码:
- clc;clear; close all;
- mat = [0:255]' * ones(1,256);
- mat = mat';
- img = mat2gray(mat);
- imshow(img);
结果:
代码:
- clc;clear; close all;
- I = imread('peppers.png');
- imshow(I);
- [r,g,b] = imsplit(I);
- montage({r,g,b},'Size',[1 3]);
结果:
代码:
- clc;clear; close all;
- rgbImage = imread('peppers.png');
- imshow(rgbImage);
- hsvImage = rgb2hsv(rgbImage);
- [h,s,v] = imsplit(hsvImage);
- montage({h,s,v},'Size',[1 3])
结果:
还有很多颜色空间之间的转换就不一一列举了:
这里就不演示了
其实这些都可以直接转换,比如我们想将uint16的矩阵I转换为uint8直接I = uint8(I)即可,其他数据类型转换也是同理!
示例:
常见几何变换
- clc;clear; close all;
- I = imread('circuit.tif');
- I2 = imcrop(I,[75 68 130 112]);
- axis image;
- subplot(1,2,1);
- imshow(I);
- title('Original Image');
- subplot(1,2,2);
- imshow(I2);
- title('Cropped Image');
- axis image;
结果:
注意matlab的图像坐标系为:
使用空间参照矩形使裁剪图像居中
- I = imread('parkavenue.jpg');
- imshow(I)
将目标窗口大小指定为 [宽度, 高度] 形式的二元素向量。
targetSize = [300 600];
创建指定裁剪窗口的空间范围的 Rectangle
对象。
r = centerCropWindow2d(size(I),targetSize);
在空间范围的界限处裁剪图像。显示裁剪的区域。
- J = imcrop(I,r);
- imshow(J)
结果:
J = imresize(I,scale)
返回图像 J
,它是将 I
的长宽大小缩放 scale
倍之后的图像。输入图像 I
可以是灰度图像、RGB 图像、二值图像或分类图像。
代码:
- clc;clear; close all;
- I = imread('rice.png');
- J = imresize(I, 0.5);
- figure;
- imshow(I);
- title('Original Image');
- figure;
- imshow(J);
- title('Resized Image');
结果:
我们都知道图像缩放需要进行插值,我们可以在imresize函数中自行选择插值方法:
我们在下面的代码中指定最近邻插值(其他代码不变):
J = imresize(I, 0.5,'nearest');
J = imresize(I,[numrows numcols])
返回图像 J
,其行数和列数由向量 [numrows numcols] 指定。
代码:
- clc;clear; close all;
- RGB = imread('peppers.png');
- RGB2 = imresize(RGB, [128 128]);
- figure;
- imshow(RGB);
- title('Original Image');
- figure;
- imshow(RGB2);
- title('Resized Image');
结果:
J = imrotate(I,angle)
将图像 I
围绕其中心点逆时针方向旋转 angle
度。要顺时针旋转图像,请为 angle
指定负值。imrotate
使输出图像 J
足够大,可以包含整个旋转图像。默认情况下,imrotate
使用最近邻点插值,将 J
中位于旋转后的图像外的像素的值设置为 0
。
代码:
- clc;clear; close all;
- I = imread('peppers.png');
- J = imrotate(I, 45, 'bilinear','loose');
- figure(1);
- imshow(I);
- figure(2);
- imshow(J);
结果:
我们将bbox参数改为crop观察图片大小是否一致:
J = imrotate(I, 45, 'bilinear','crop');
可以看到改为'crop'后图片大小一致!
B = impyramid(A,direction)
computes a Gaussian pyramid reduction or expansion of A
by one level. direction
determines whether impyramid
performs a reduction or an expansion.
代码:
- clc;clear; close all;
- I = imread('cameraman.tif');
- I1 = impyramid(I, 'reduce');
- I2 = impyramid(I1, 'reduce');
- I3 = impyramid(I2, 'reduce');
- figure, imshow(I);
- figure, imshow(I1);
- figure, imshow(I2);
- figure, imshow(I3);
结果:
注:图像滤波也可以用filter2函数,与imfilter的区别请自行help命令查看
注意上面说的imfilter默认使用相关性而不是卷积,若要使用卷积进行滤波则需要指定'conv'参数!
示例:
读取图像并显示:
- I = imread('cameraman.tif');
- imshow(I);
创建运动滤波器,并使用它来对图像进行模糊处理。显示模糊处理后的图像。
- H = fspecial('motion',20,45);
- MotionBlur = imfilter(I,H,'replicate');
- imshow(MotionBlur);
创建圆形滤波器,并使用它来对图像进行模糊处理。显示模糊处理后的图像。
- H = fspecial('disk',10);
- blurred = imfilter(I,H,'replicate');
- imshow(blurred);
在执行imfilter时要注意的是将图像转换为uint8型以避免滤波核有负数值导致输出有负数:
在此要与我们图像之间的运算做区分!我们想把两个图像相加再除2即取均值时我们往往先将两个图像转换为double来防止uint8的截断!而这里则是要刻意使用uint8来截断,注意细节!
注意,这里的滤波核大小未给出,经查看源码后,滤波核大小默认为3*3,sigma默认为0.5,如果要自己指定滤波核大小,以第三种键值对的方式给出:
示例: B = imgaussfilt(A,'FilterSize',3);
代码演示:
- clc;clear; close all;
- I = imread('cameraman.tif');
- Iblur = imgaussfilt(I,2, 'FilterSize',7); % sigma = 2, kernel_size = 5*5
- montage({I,Iblur});
- title('Original Image (Left) Vs. Gaussian Filtered Image (Right)');
同样的,我们选择常用函数进行演示!
调整灰度图像的对比度
- clc;clear; close all;
- I = imread('pout.tif');
- J = imadjust(I);
- montage({I,J});
调整灰度图像的对比度,指定对比度限制
- clc;clear; close all;
- I = imread('pout.tif');
- K = imadjust(I,[0.3 0.7],[]); %low_out和high_out未给出时默认等于low_in,high_in
- montage({I,K});
调整彩色图像的对比度
- clc;clear; close all;
- RGB = imread('football.jpg');
- RGB2 = imadjust(RGB,[.2 .3 0; .6 .7 1],[]);%对应彩色图像三通道的low_in,high_in
- montage({RGB,RGB2});
图像锐化
- clc;clear; close all;
- a = imread('hestain.png');
- imshow(a)
- title('Original Image');
- b = imsharpen(a);
- figure, imshow(b)
- title('Sharpened Image');
在边界上控制锐化的数量
- clc;clear; close all;
- a = imread('rice.png');
- imshow(a), title('Original Image');
- b = imsharpen(a,'Radius',2,'Amount',1);
- figure, imshow(b)
- title('Sharpened Image');
- clc;clear; close all;
- I = imread('eight.tif');
- J = imnoise(I,'salt & pepper',0.02);
- montage({I,J});
- title('Original Image(left) and Noise Image(right)');
其中的SE:
- original_img = imread('Fig0905(a)(wirebond-mask).tif');
- subplot(1,4,1);
- imshow(original_img);
- %三次不同大小的腐蚀操作比较
- SE = strel('rectangle',[11 11]);
- out = imerode(original_img, SE);
- subplot(1,4,2);
- imshow(out);
-
- SE = strel('rectangle',[15 15]);
- out = imerode(original_img, SE);
- subplot(1,4,3);
- imshow(out);
-
- SE = strel('rectangle',[45 45]);
- out = imerode(original_img, SE);
- subplot(1,4,4);
- imshow(out);
注意,每一次腐蚀都会导致中间的白圈变小,这里不大明显!
下面我们用nhood再演示一下腐蚀操作:
- original_img = imread('Fig0905(a)(wirebond-mask).tif');
- subplot(1,2,1);
- imshow(original_img);
-
- nhood = ones(45);
- out = imerode(original_img, nhood);
- subplot(1,2,2);
- imshow(out);
和腐蚀的参数差不多!
- original_img = imread('Fig0907(a)(text_gaps_1_and_2_pixels).tif');
- imshow(original_img);
-
- nhood = [0 1 0;1 1 1;0 1 0];
- out = imdilate(original_img, nhood);
- figure();
- imshow(out);
放大后观察效果:
与腐蚀和膨胀的语法差不多哈
下面这个示例演示先开运算在闭运算结果
- original_img = imread('Fig0911(a)(noisy_fingerprint).tif');
- subplot(1,3,1);
- imshow(original_img);
-
- nhood = ones(3);
- out = imopen(original_img, nhood);
- subplot(1,3,2);
- imshow(out);
-
- out = imclose(out, nhood);
- subplot(1,3,3);
- imshow(out);
- clc;clear; close all;
- I = imread('cameraman.tif');
- J = uint8(filter2(fspecial('gaussian'), I));
- K = imabsdiff(I,J);
- figure;
- imshow(K,[]);%将K中像素最小值设为黑色,最大值设为白色
将两个图像相加。将输出指定为 uint16
类型以避免截断结果。
- clc;clear; close all;
- I = imread('rice.png');
- J = imread('cameraman.tif');
- K = imadd(I,J,'uint16');
- imshow(K,[]);
5.3、imsubtract
从一个图像中减去另一个图像或从图像中减去常量
减去图像背景
- clc;clear; close all;
- I = imread('rice.png');
- %估计背景
- background = imopen(I,strel('disk',15));
- %从图像中减去背景
- J = imsubtract(I,background);
- montage({I,J});
代码演示:
- clc;clear;close all;
- im = imread('street.jfif');
- figure(1);
- imshow(im);
- im = rgb2gray(im);
- out = fft2(im);
- figure(2);
- imshow(abs(out),[]); %取实部
可能会有疑问,为什么傅里叶变换黑的啥都没有呢?事实上如果我们将Figure2的左上角放大,其实是这个样子:
所以事实是只有左上角值比较大看起来是白色,而这就是我们的直流分量。事实上这种现象的原因是直接用fft2的话频谱的原点不在图像中心 而在左上角。
如果我们想将原点移到中心,我们需要用fftshift函数:
让我们在上面的代码加上:
- figure(3);
- out = fftshift(out);
- imshow(abs(out),[]);
这样就对了!
下面我们进行频域的低通滤波再逆傅里叶变换查看结果
- clc;clear;close all;
- im = imread('Fig0638(a)(lenna_RGB).tif');
- figure(1);
-
- im = rgb2gray(im);%转灰度
- imshow(im);
- title('原图');
- [M N] = size(im);
- im_f = fft2(im);
-
- lp = fspecial('gaussian',25,2);%高斯低通滤波器(空间域)(补零到与原图一样大小)
- lp_f = fft2(lp,M,N);%高斯低通滤波器(频域)
- figure(2);
- surf(fftshift(abs(lp_f)),'edgecolor','none');%surf函数画曲面图
- title('滤波核频域曲面图');
-
- out_f = im_f.*lp_f; %频域相乘
- out = ifft2(out_f);%空间域结果
- figure(3);
- imshow(abs(out),[]);
- title('结果');
-
-
这里我们的滤波核是用的自带的,当然我们也可以自定义一个频域低通滤波器:
- %D(u,v)<=D0时有值
- u = 0:Q-1
- v = 0:P-1
- %calculate D(u,v)
- H = double(D<=D0)
参考资料:
MATLAB官方文档的Image Processing Toolbox
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。