一、imfinfo函数——查看图像文件信息,注意参数是文件路径和文件名,不是图像对应的矩阵。
>> imfinfo('C:\Users\zhulf\Desktop\1.jpg')
ans =
Filename: 'C:\Users\zhulf\Desktop\1.jpg'
FileModDate: '19-Apr-2015 08:40:54'
FileSize: 1528413
Format: 'jpg'
FormatVersion: ''
Width: 1548
Height: 1548
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {}
Make: 'Smartisan'
Model: 'Smartisan T1'
Orientation: 0
DateTime: '2015:04:19 08:40:53'
DigitalCamera: [1x1 struct]
GPSInfo: [1x1 struct]
MeteringMode: 'unknown'
LightSource: 'unknown'
Flash: 16
二、imshow函数
1、imshow(I) 显示图像I
Matlab代码:
>> I=imread('2.jpg');
>> imshow(I)
显示结果
2、imshow(I,[low high]) 它显示的是像素处理后的图像I,注意的是它只是显示的时候改变了图像像素,实际上并没有改变图像像素,图像像素值还是原来的值。
Matlab代码:
>> I=imread('2.jpg');
>> imshow(I,[0 80])
它对图像像素的处理是:将I中像素值大于等于high变成high,将小于等于low的变成low,再将[low,high]中间的像素映射为默认的像素级,一般为[0,255]。
我们把上述描述转为代码:
I=imread('2.jpg');
mmax=max(I(:));
mmin=min(I(:));
for i=1:256
for j=1:256
if I2(i,j)<=0 I2(i,j)=0;
elseif I2(i,j)>=80
I2(i,j)=255;
end
end
end
I3=I2;
for i=1:256
for j=1:256
I3(i,j)=255/80*I3(i,j);
end
end
imshow(I3)
显示图像结果为
和imshow(I,[0 80])效果是一样的。
3、 imshow(I,[ ]) 它等同于imshow(I,[min(I:),max(I:)]),可以理解为把图像I转化成0-255灰度级来显示。
我们在这里做一个实验:下面三幅图分别为imshow(I),imshow(I,[])和把图像像素值映射为[0,255]所显示的图像。
我们发现,imshow(i,[])显示的效果正和把像素值映射为[0,255]效果所显示的一样。
Matlab代码如下:
A=imread('C:\Users\zhulf\Desktop\Image1 - SliceImage - 008.tif');
mmax=max(A(:));
mmin=min(A(:));
for i=1:4096
for j=1:4096
A2(i,j)=1.0*255/(mmax-mmin)*(A(i,j)-mmin);
end
end
imshow(A)
figure,imshow(A,[])
figure,imshow(A2)
再例如,一个灰度级为17-2424的int16类型的图像,matlab显示(imshow(I))效果如下,
可见,显示效果并不好,接下来我们使用imshow(I,[]),显示结果如下:
显示结果较好,对比度较高。同样,imshow(I,[])的效果等同于把像素映射到0-255灰度级,映射后图像如下:
实现灰度映射的Matlab如下:
A=dicomread('C:\Users\zhulf\Desktop\IM62.dcm');
mmax=double(max(A(:))); %类型转换很重要
mmin=double(min(A(:))); %类型转换很重要
for i=1:512
for j=1:512
tmp=double(A(i,j)); %类型转换很重要
A2(i,j)=uint8(255*(tmp-17)/2407); %类型转换很重要
end
end
imshow(A)
figure,imshow(A,[])
figure,imshow(A2)
上面是对imshow()函数的理解,不明白的欢迎留言交流。
三、rgb2gray 将彩色图像转换为灰度图像
>> A=imread('C:\Users\zhulf\Desktop\1.jpg');
>> B=rgb2gray(A);
>> imshow(A)
>> figure,imshow(B)
四、数据类型转换函数
im2uint8 将图像转换为uint8类,相应的像素值也会变化到相应范围,如对uint16类图像应用im2uint8,则像素值由0-65535变化成0-255,这是一种线性映射。
im2uint16 将图像转换为uint16类,也有上面如此的性质。
im2double 将图像转化为double类,必要时缩放像素值。如果图像img是double型的,d=img;如果图像是logical或single型图像,d=double(img);如果图像是uint8型,d=double(img)/255;如果图像是uint16型,d=double(img)/65535。
im2double一般会将uint8归一化到[0,1],而double只是将数据变为double,如:
a = uint8(250);
b = double(a)
c = im2double(a)
b =
250
c =
0.9804
im2single 将图像转化为single类,性质和im2single类似。
mat2gray 可以将图像转换为标定[0,1]范围的double类的图像。
调用的语法是:
g=mat2gray(A,[Amin,Amax]),其中g具有0(黑)到1(白)的值。参数Amin使得A中小于Amin的值,在g中变为0;而在A中大于Amax的值,在g中变为1。
也可以是:
g=mat2gray(A),
Amin,Amax默认为A中实际的最大值和最小值,它独立于输入的类,将整个输入值的范围标定为[0,1]。
>> f=[1 2;3 4]
f =
1 2
3 4
>> g=mat2gray(f)
g =
0 0.3333
0.6667 1.0000
BW = im2bw(I,LEVEL) 二值化图像,将大于LEVEL的像素值变为1,小于LEVEL的像素值变为0,且图像像素变成逻辑类;LEVEL是阈值,在[0,1]之间。
>> gb=im2bw(g,0.6)
gb =
0 0
1 1
>> gbv=islogical(gb)
gbv =
1
五、whos
B为图像矩阵
>> whos B
Name Size Bytes Class Attributes
B 1548x1548 2396304 uint8
六、反转图像
>> I=imread('C:\Users\zhulf\Desktop\2.jpg');
>> imshow(I)
上下翻转:
>>I2=I(end:-1:1,:);
>> figure,imshow(I2)
上下左右均反转:
>> I3=I(end:-1:1,end:-1:1);
>> figure,imshow(I3)
七、抽取图像(压缩图像)
>> I4=I(520:855,90:837);
>> figure,imshow(I4)
图像也由原来的1548 x 1548变成了336 x 748。
>> I5=I(1:2:end,1:2:end);
>> figure,imshow(I5)
图像由1548 x 1548 变成了774 x 774,filesize由99745变成了76747,做了部分压缩,但清晰度差不多。
八、improd()函数
function[p,pmax,pmin,pn]=improd(f,g)
%IMPROD Computes the produce of two images.
%[P,PMAX,PMIN,PN]=IMPROD(F,G) outputs the element-by-element
%product of two input images,F and G,the product
%maximum and minimum values,and a normalized product array with
%values in the rang[0,1].The input images must be of the same
%size.They can be of class uint8,uint16,or double. The outputs
%are of class double.
fd=double(f);
gd=double(g);
p=fd.*gd;
pmax=max(p(:));
pmin=min(p(:));
pn=mat2gray(p);
>> [p,pmax,pmin,pn]=improd(f,g)
p =
1 4
6 4
pmax =
6
pmin =
1
pn =
0 0.6000
1.0000 0.6000
之后陆续补充。。