根据特性分为:
- 位图
通常用数字阵列来表示,常见的格式有BMP,JPG,GIF
- 矢量图
是由矢量数据库来表示,常见的格式有PNG图像
根据每个像素所代表的信息不同分为:
- 二值图像
0来表示黑色,1来表示白色—-越大越亮
- 灰度图像
所有的取值在0-255,然后值越大越白
- RGB图像
RGB颜色代码可以用16进制来书写
//两个16进制组成排列有256中可能
0XFF0000//表示红色R
0X00FF00//表示绿色G
0X0000FF//表示蓝色B
0X000000//表示黑色
0XFFFFFF//表示白色
0X808080//表示灰色
像素就是包含有图像的信息的一个最小的集合。
图像的空间分辨率(spatial Resolution)是指的图像中单位长度包含像素和点的数目,通常用像素/英寸(ppi)为单位来表示。例如72ppi就表示图像中每英寸包含72个像素或点
灰度级分辨率又叫做色阶,色阶是指的图像中可分辨的灰度级数目,色阶越少,可以颜色数目也越少。
数字图像中一些基本的性质:
- 邻接性
- 连通性
- 区域与边界
在MATLAB中细胞数组就是可以在一个数组内部定义
>>cell={'a',12};
>>cell{1}='a'%用花括号进行索引
结构体就是一种聚合类型
struct.Name='David_Han';
struct.Age=23;
struct =
Name: 'David_Han'
Age: 23
meshgrid函数是拥有绘制三维曲面
绘制中心在原点的二维高斯函数的图像
u=[-10:0.1:10];
v=[-10:0.1:10];%取200个点
[U,V]=meshgrid(u,v);
H=exp(-(U.^2+V.^2)./2/3^2);
mesh(u,v,H)%用于出图
A=imread('C:\Users\Administrator\Desktop\1.jpg');
imshow(A)
imfinfo('C:\Users\Administrator\Desktop\1.jpg')
ans =
Filename: 'C:\Users\Administrator\Desktop\1.jpg'
FileModDate: '23-十月-2016 15:11:09'
FileSize: 92558
Format: 'jpg'
FormatVersion: ''
Width: 811
Height: 695
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Progressive'
Comment: {}
>> load mri%载入matlab中自带图像
>> imshow(D(:,:,7),map)
load mri
imshow(D(:,:,7),map);
figure,montage(D,map);
figure
mov=immovie(D,map);
colormap(map);%设定颜色表
movie(mov);%播放电影
输入impixellinfo命令后,对着光标的移动就会显示出指针位置的像素值
还可以通过输入imdistline命令后查看两点之间的距离
灰度直方图用于图像分割和图像灰度变等过程
图像的直方图描述的是图像中各个灰度等级出现个概率,横坐标表示的是各个像素点的灰度级别,纵坐标是各个灰度级别的像素在图像中出现的次数或者概率。
在这个地方一直报错,目前知道的原因是因为图片的格式不是tif,我用示例照片是可以做的
注意:现在看来是因为不是灰度图像,所以要将彩色图像转化成灰度图像。
I = imread('pout.tif');
imhist(I)
对灰度图像乘以线性变换用来改变图像的灰度值
灰度的对数变换可以增强一副图像中较暗部分的细节
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
figure;
imshow(A);
title('傅里叶变换前')
%显示出这幅图像的频谱
F=fft2(im2double(A));
F=fftshift(F);%也就是说用fft和fftshift两个函数,才完成了傅里叶变换
F=abs(F);%求出他的实部
figure
imshow(F,[]);
title('傅里叶变换后')
解释部分:
1、im2double(A)%这个函数将图像转化成double类型
%转化成double类型后再对这个图像进行二维的傅里叶变换,并且将这个值赋值给F
2、fftshift函数:
fftshift的作用正是让正半轴部分和负半轴部分的图像分别关于各自的中心对称。因为直接用fft得出的数据与频率不是对应的,fftshift可以纠正过来
哈哈,我把女神的照片便道频域上了
离散傅里叶的核心就是:反折,移位,相乘,相加
在频域上进行对数变换前后对比:
代码:
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
%figure;
%imshow(A);
%title('傅里叶变换前')
%显示出这幅图像的频谱
F=fft2(im2double(A));
F=fftshift(F);%也就是说用fft和fftshift两个函数,才完成了傅里叶变换
F=abs(F);%求出他的实部
figure
imshow(F,[]);
title('对数变换前')
%经过对数变换后
T=0.1*log(F+1.5);
figure
imshow(T);
title('频域经过对数变换后')
好漂亮啊!!
反正规律就是前面的系数越小就越黑,系数越大,就越白
伽玛变换也叫做指数变换或者幂次变换
是一种常用的灰度非线性变换
MATLAB中实现伽玛变换的是imadjust函数
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
subplot(1,3,1);
imshow(A);
title('伽玛变换前')
%Gamma取0.5
subplot(1,3,2)
imshow(imadjust(A,[],[],0.5));
title('Gamma取0.5')
%Gamma取1.5
subplot(1,3,3)
imshow(imadjust(A,[],[],1.5));
title('Gamma取1.5')
J=imadjust(I,[low_in,high_in],[low_out,high_out],gamma);
%该函数将输入图像I中的low_in,high_in之间的值映射到输出图像J中,low_out 和 high_out之间的值,其他区域将会被裁减掉
Gamma>1,图像的高灰度区域对比度得到增强,也就是说区分度更大,图像变暗
Gamma=1,灰度变换是线性的
Gamma<1,图像的低灰度区域得到增强,图像变亮了,区分度更小
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
subplot(2,3,1);
imshow(A);
title('伽玛变换前')
%Gamma取0.5
subplot(2,3,2)
imshow(imadjust(A,[],[],0.5));
title('Gamma取0.5')
%Gamma取1.5
subplot(2,3,3)
imshow(imadjust(A,[],[],1.5));
title('Gamma取1.5')
subplot(2,3,4)
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
imhist(I);
subplot(2,3,5)
imhist(imadjust(I,[],[],0.5));
subplot(2,3,6)
imhist(imadjust(I,[],[],1.5));
%这个函数可以将彩色图像转换成灰度图像
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
灰度的阈值判断可以将一副灰度图像转变黑白的二值图像,用户给定一个分界线,高于这个分界线灰度值设成1,低于分界线的灰度值设成0。灰度的阈值变换经常用于图像分割
MATLAB中和图像的阈值变换相关的函数
Bw=im2bw(I,level)%I是输入图像,level是一个在0~1之间的双精度浮点数,例如166/255
thresh=graythresh(I) %graythesh函数自动为这个变换找到最优解
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
thresh=graythresh(A);
Bw1=im2bw(A,thresh);
subplot(1,3,1)
imshow(Bw1)
title('graythresh最优化的解')
Bw2=im2bw(A,50/255);
subplot(1,3,2)
imshow(Bw2)
title('阈值取50/255')
Bw3=im2bw(A,200/250);
subplot(1,3,3)
imshow(Bw3)阈值越小,白的部分越多,阈值越大,黑的部分越多
title('阈值取200/255')
分段线性变换:对用户感兴趣的部分进行增强,对用户不感兴趣的部分进行减弱
直方图均衡化也叫灰度均衡化,是指的通过某种灰度映射使得,在整个直方图灰度的概率近似相等
matlab中提供的直方图均衡化的函数
[J,T]=histeq(I)%I是输入原始图像,J是经过直方图均值化输出的图像,T是变换矩阵
clear all
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
subplot(2,2,1)
imshow(I);
title('初始图像');
subplot(2,2,3)
imhist(I);
title('初始图像的直方图')
subplot(2,2,2)
imshow(histeq(I));
title('均值化');
subplot(2,2,4)
imhist(histeq(I));
title('均值化的直方图');
直方图规定化是在直方图均衡化的基础上建立的,我们希望得到人们预期的直方图的形状,而直方图图均衡化做不到,所以就有了直方图规定化
[J,T]=histeq(I),hgram)%hgram叫做直方图的收集箱数目,
对于double类型的图像,hgram的范围是[0,1],
对于unit8类型的图像而言,是[0,255],
对于unit16型的图像取值范围[0,65535]
65535是计算机16位二进制最大数
clear all
%导入预期图像的灰度值
Idea=imread('D:\MATLAB\matlab编写的程序\原材料\2.png');
Idea=rgb2gray(Idea);%并且把他转化成灰度图像
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);%只有把原始的彩色图像转化成灰度图,才可以产生灰度的直方图
subplot(2,3,1)
imshow(I);
title('初始图像');
subplot(2,3,4)
imhist(I);
title('初始图像的直方图');
subplot(2,3,2)
imshow(Idea);
title('预期图像');
subplot(2,3,5)
imhist(Idea);
title('预期图像的直方图');
[x,hgram1]=imhist(Idea);%从目标函数中提取hgarm
J=histeq(I,hgram1);
subplot(2,3,3)
imshow(J);
title('标定化后');
subplot(2,3,6)
imhist(J);
title('标定化后');
图像分割是指将图像中具有特殊意义的不同区域划分开来。
图像分割算法是基于图像灰度值的不连续性或其相似性。
图像的边缘是图像的最基本的特征,边缘点是指图像中周围像素灰度有了阶跃变化的那些像素点
1、梯度算子
sobel算子,prewitt算子,roberts算子
2、基于高斯-拉普拉斯算子边缘检测
MATLAB实现:
BW=edge(I,type,thresh,direction,'nothinning');
%I是输入灰度图像
type是梯度算子的种类:sobel\prewitt\roberts
thresh是敏感度阈值函数,任何灰度值低于此阈值函数的都不会被检测到
direction指定的是操作者感兴趣的边缘方向:horizontal/vertical/both
nothinning是可选参数,是指可以跳过边缘细化算法来加快算法的运行速度,在默认的条件下,"thinning"就是边缘细化
bw是返回的二值图像,1白色为边缘部分
BW=edge(I,'log',thresh,sigma)
参数:
I:输入图像
"log"表示高斯-拉普拉斯算子
thresh也是敏感度阈值参数
sigma指定生成高斯滤波所使用的标准差,默认的标准差值为2,滤镜
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B1=edge(I,'sobel');
subplot(1,3,1)
imshow(B1);
B2=edge(I,'prewitt');
subplot(1,3,2)
imshow(B2);
B3=edge(I,'roberts');
subplot(1,3,3)
imshow(B3);
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'log');
imshow(B4);
canny算子的边缘检测
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'canny');
imshow(B4);
1、[H,theta,rho]=hough(BW,param1,val1,param2,val2);
BW是边缘检测后额二值图像
param1,val1与param2,val2是一一配对的
H是变换得到的hough矩阵
theta和rho是Hough对应于矩阵的每一列和每一行的角度和半径组成的向量
2、Houghpeaks()函数用于寻找hough矩阵中寻找指定数目的峰值点
Pesks=houghpeaks(H,numpeaks,param1,val1,param2,val2)
H是由于hough()函数得到的hough矩阵
numpeaks是指需要找到的峰值数目,默认值为1
param1,val1与param2,val2是一一配对的
3、houghlines()根据hough矩阵的峰值检测结果提取直线的线段
lines=houghlines(BW,theta,rho.peaks.param1,val1,param2,val2)
BW是边缘检测后的二值图像
theat和rho是由hough函数返回得到
param1,val1与param2,val2是一一配对的
clear all
%导入预期图像的灰度值
A=imread('D:\MATLAB\matlab编写的程序\原材料\1.png');
I=rgb2gray(A);
B4=edge(I,'canny');
figure;
imshow(B4);
[H,T,R]=hough(B4);%Hough矩阵图像中标出峰值位置,经过边缘检测后的图像进行拆分
figure;
imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');
%在hough矩阵中寻找前5个大于hough矩阵中最大值的0.3倍峰值
P=houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x=T(P(:,2));
y=R(P(:,1));
plot(x,y,'s','color','red');%标出峰值的位置
lines=houghlines(B4,T,R,P,'FillGap',5,'Minlength',7);%合并小于5的线段,丢弃所有长度小于7的线段
figure,imshow(A),hold on
max_len=0;
for k=1:length(lines)
xy=[lines(k).point1;lines(k).point2];
plot(xy(:,1),xy(:,2),'lineWidth',2,'color','green');
%绘制线段的端点
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'color','red');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'color','green');
len = norm(lines(k).point1-lines(k).point2);
if(len>max_len)
max_len=len;
xy_long=xy;
end
end
原理方面真的不是很懂啊,就事找出特征点,然后进行画图
红色的就是特征点,然后绿色的就是连接的线
11111
用函数SVMtrain()来训练一个SVM分类器
SVMStruct=svmtrain(Trainning,Group)
Training是一个包含训练数据的m行和n列的2维矩阵,每行表示的1个训练样本,m表示训练样本数目,n表示样本维数
Group是一个代表训练样本类标签的1维向量,其中每个元素只能为0或者1;1表示正例,0表示反例
Group的维数(也就是列数),必须和Training和行数相等
SVMStruct是训练所得到的代表SVM分类器的结构体,其中包含
设定核函数
SVMStruct=svmtrain(...,'Kernel_Function','Kernel_FunctionValue');
Kernel_FunctionValue的取值: