由于工作需要,开始研究一下MATLAB图像处理相关的知识,图像处理只是matlab应用领域中小小的一部分而已。以前只是听说过MATLAB很强大,但没有系统的学过,如今开始学时,发现matlab确实很不错、很高大上。操作起来很方便,特别是编写程序时,比C语言更简洁。
很多人都是大学里就学过matlab的,由于是半路出家,所以知识不是很全面,直接拿了一本冈萨雷斯的MATLAB版的书就开始看,下面做一些简单的小记录。
基础命令:
clc——清除窗口
clear——清除之前赋值过的变量.*表示矩阵中元素与元素相乘,这两个矩阵的维数必需相同。/和./也一样的道理
length/size/numel的用法:
length(x) ——返回x的长度 如果x是单个变量 返回1 如果x是矩阵 返回该矩阵行数与列数中的较大者。
size(x) ——当x是单个变量时,返回[1 1] 当x是矩阵是 返回矩阵的行数与列数 可以这样来接受[m n]=size(x)
numel(x) ——当x是单个变量时 返回1, 当x是矩阵时,返回矩阵元素总个数。
/mean函数:
>>如果有这样一个矩阵:A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
用mean(A)(默认dim=1)就会求每一列的均值
ans =
3.0000 4.5000 6.0000
>>用mean(A,2)就会求每一行的均值
ans =
2.0000
4.0000
6.0000
6.0000
>> mean(A(:)) 求总的平均值
其他函数:
zeros(M,N)——生成一个M*N的double型矩阵 元素均为0
ones(M,N)——生成一个M*N的double型矩阵 元素均为1
true(M,N)——生成一个M*N型的logical矩阵,元素均为1matlab函数设计:
.m文件建立的函数文件% xxxxxx 代表注释,在命令窗口中输入help fun可以显示这个注释
实例:
function [g,k,l] = two(x)
error(nargchk(1,1,nargin))
% error(nargchk(1,2,nargin))
if x<=1
g = x;
end
g = 0;
k = nargin;
l = nargout;
for i=1:1:x
g = g + i;
end
调用时写tow(10),就可以计算1~10的和。
匿名函数:
var = @(x)(x+1)error(nargchk(1,2,nargin));
imgBytes / compress_bytes ==压缩比
命令窗口输入:imfinfo test.jpg,显示信息如下:
ans =
Filename: 'C:\Documents and Settings\Administrator\My Documents\MATLAB\test.jpg'
FileModDate: '30-Sep-2014 10:31:18'
FileSize: 1609315
Format: 'jpg'
FormatVersion: ''
Width: 2336
Height: 1752
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
double/im2double/mat2gray的区别:
A=imread('1.jpg');
A(1,1,:) ——显示A中第1行第一列像素点(包含红、绿、蓝)三个分量的值im2double:如果输入类型是uint8、unit16 、logical,则按照0-->>0,255-->>1,将其值按比例处理成0~1之间的double数值;如果输入类型是double,输出没有处理;
double:返回数值与输入相同的double类型矩阵;
mat2gray:对输入进行归一化处理,最小值-->>0;最大值-->>1,输出类型为double。在实际的对图像处理过程中,由于我们读入图像是unit8型,而在MATLAB的矩阵运算中要求所有的运算变量为double型(双精度型)。因此通常使用im2double函数将图像数据转换成双精度型数据。
注意:uint8类、uint16类RGB图像取值范围分别是[0, 255]、[0, 65535],而double类范围是[0, 1]
C=[-1,0.5; 2,3]IPT支持的图像的算术函数:
imadd——图像相加图像旋转函数:
imrotate,matlab默认是逆时针旋转, imrotate参数解释:
angle顾名思义 就是你旋转的角度, method 就是你实现旋转用的是什么方法, 有三种 和后面的插值放大缩小是一下 就是 最邻近插值法 双线性插值法 三次卷积插值法, 英语表示就是 'nearest' 'bilinear' 'bicubic'。loose 就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样你得到的图片就是一个完整的图片
matlab的解释是 When BBOX is 'loose', B
includes the whole rotated image, which generally is larger than A.>> subplot(2,2,1)
>> imshow(A)
>> subplot(2,2,2)
>> imshow(imrotate(A, 30, 'bilinear', 'loose'));
>> subplot(2,2,3)
>> imshow(imrotate(A, 30, 'bilinear', 'crop'));
>> A=imread('test.jpg');
>> B=rgb2gray(A);
>> imhist(B);//显示直方图
>> figure;
>> imhist(histeq(B)) //显示均衡化后的直方图
>> C=histeq(B);
>> imwrite(C, 'xxx.jpg');
图像如下所示:
4. 空间滤波:
线性空间滤波:imfilter函数使用拉普拉斯算子来增强图像,包括锐化,同时应该保留其灰度色调
test_shape.m
function [] = test_sharp(A)
% Test Sharp
B= im2double(A);
w= fspecial('laplacian', 0);//laplacian时 第二个参数默认是0.5
C= imfilter(B, w, 'replicate');
D= B-C;
imwrite(D, 'out.jpg');
最后对比A与C的效果 发现图像明显更为清晰了。。。
可以直接用unsharp选项,效果与上面的差不多
A=imread('test.jpg');
w = fspecial('unsharp')
B=im2double(A);
C=imfilter(B, w, 'replicate');
imwrite(C, 'out.jpg');
function [] = test_sharp(A)
w4 = fspecial('laplacian', 0);
w8 = [1 1 1; 1 -8 1; 1 1 1];
A = im2double(A);
A4 = A - imfilter(A, w4, 'replicate');
A8 = A - imfilter(A, w8, 'replicate');
imwrite(A4, '4.jpg');
imwrite(A8, '8.jpg');
会发现图像锐化效果更好,图像更清晰。
图像中加入噪声:格式:J = imnoise(I, type, parm)
>> A=imread('test.jpg');clear
rgb=imread('xxx.jpg');
rgb_r=rgb(:,:,1);
rgb_g=rgb(:,:,2);
rgb_b=rgb(:,:,3);
[x y z]=size(rgb);
zero=zeros(x, y);
R=cat(3,rgb_r,zero,zero);
G=cat(3,zero,rgb_g,zero);
B=cat(3,zero,zero,rgb_b);
RGB=cat(3,rgb_r,rgb_g,rgb_b);
subplot(2,2,1),imshow(R),title('红色分量');
subplot(2,2,2),imshow(G),title('绿色分量');
subplot(2,2,3),imshow(B),title('蓝色分量');
subplot(2,2,4),imshow(RGB);