图像像素的距离
在说基本运算之前,先把图像像素间的距离说一下(不想再写一篇了🤣)
邻域
相邻像素——4邻域
- 4邻域:像素p(x,y)的4邻域是: (x+1,y);(x-1,y);(x,y+1);(x,y-1)
- 用N4(p)表示像素p的4邻域
相邻像素——D邻域
- D邻域( diagonal )定义:像素p(x,y)的D邻域是:对角上的点 (x+1,y+1);(x+1,y-1);(x-1,y+1);(x-1,y-1)
- 用ND(p)表示像素p的D邻域 :
相邻像素——8邻域
- 8邻域定义:像素p(x,y)的8邻域是:4邻域的点 + D邻域的点
- 用N8§表示像素p的8邻域。
-N8(p)= N4(p)+ ND(p)
邻接性
- 邻接性是描述区域和边界的重要概念
- 两个像素邻接的两个必要条件是:
两个像素的位置是否相邻
两个像素的灰度值是否满足特定的相似性准则(或者是否相等)都属于V
像素间的邻接性——4邻接
对于具有值V的像素p和q,如果q在集合N4(p)中,则称这两个像素是4邻接的。
像素间的邻接性——8邻接
对于具有值V的像素p和q,如果q在集合N8(p)中,则称这两个像素是8邻接的 。
像素间的邻接性——m邻接
对于具有值V的像素p和q,如果:
- q在集合N4(p)中,或
- q在集合ND(p)中,并且N4(p)与N4(q)的交集为空(没有值V的像素)。则称这两个像素是m邻接的,即4邻接和D邻接的混合连通
以上也是8邻接与m邻接的区别
通路
定义:一条从具有坐标(x,y)的像素p,到具有坐标(s,t)的像素q的通路。
(x0,y0),(x1,y1),…,(xn,yn)的不同像素的序列。其中,(x0,y0) = (x,y),(xn,yn) = (s,t),(xi,yi) 和(xi-1,yi-1)是邻接的,1 ≤ i ≤ n,n是路径的长度。如果(x0,y0) = (xn,yn) ,则该通路是闭合通路
可依据特定的邻接类型定义4通路、8通路和m通路。
不出例题演示了,当寻找终点时切记若有对角邻接则要先走对角
连通分量
令S是图像中的一个像素子集。如果在S中全部像素之间存在一个通路,则可以说p和q在S中是连通(connected)的。对于S中的任何像素p,S中连通到该像素的像素集称为S的连通分量。如果S仅有一个连通分量,则集合S称为连通集(connected set)。
连通域存能走的通路(集合形式)
距离
像素距离的定义
对于像素p(x , y),q(s , t),z(v , w),用D(p , q)来表示像素p , q间的距离,像素间距离的(D(x , y)应满足的如下条件:
- D(p , q) ≥ 0.(当且仅当p = q);
- D(p , q) = D(q , p);
- D(p , q) + D(q , z) ≥ D(p , z);
像素距离的分类及计算方法
像素p(x,y)和q(s,t)间的欧式距离定义:
欧式距离就是数学中学到的直线距离公式
像素p(x,y)和q(s,t)间的D4距离(城区距离)定义:
D4模型只能走横竖两个方向,不能走斜向。两个点的距离就是横向加竖向的距离之和。
像素p(x,y)和q(s,t)间的D8(街区距离)距离定义:
D8的模型就是围着P点的所有元素都是相邻的,也就是它下一步可以走到包围它的八个点的任何一个,也就是横竖和斜向。
对于可以横竖和斜向走的最短距离,就是横向或竖向的距离的最大值。
图像的基本运算
图像处理是建立在各种算法基础上的处理方法,图像基本运算主要包括点运算、代数运算(加、减、乘、除)、逻辑运算(与、或、非)和几何运算(平移、镜像、旋转、缩放)。这些基本运算都具有十分重要的意义,如:改变输入图像的灰度级、降低图像的噪声、进行各种各样的几何变换。
点运算
点运算是对图像的每个像素点的灰度值按一定的映射关系运算,得到一福新图片的过程。由于点运算能够有规律的改变像素点的灰度值,故也被称为对比度增强或灰度变换。
线性点运算
线性点运算是指输入图像的灰度级与输出图像呈线性关系。
r为输入灰度值,s为相应点的输出灰度值
- 当a=1,b=0时,新图像与原图像相同;
- 当a=1,b≠0时,新图像是原图像所有像素的灰度值上移或下移,是整个图像在显示时更亮或更暗;
- 当a>1时,新图像对比度增加;
- 当a<1时,新图像对比度降低;
- 当a<0时,暗区域将变亮,亮区域将变暗,点运算完成了图像求
I=imread('1.jpg');
I=im2double(I);
figure(1);subplot(3,2,1);
imshow(I);
title('原图像','fontsize',7);
a=1;
b=50;
O=a.*I+b/255;
figure(1);
subplot(3,2,2);
imshow(O);title('a=1,b=50,图像变亮','fontsize',7);
a=2;b=0;
O=a.*I+b/255;
figure(1);subplot(3,2,3);imshow(O);
title('a=2,b=0,对比度增大','fontsize',7);
a=0.5;b=0;
O=a.*I+b/255;
figure(1);subplot(3,2,4);imshow(O);
title('a=0.5,b=0,对比度降低','fontsize',7);
a= -1;b=255;
O=a.*I+b/255;
figure(1);subplot(3,2,5);imshow(O);
title('a=-1,b=255,图像反色','fontsize',7);
运行结果:
注:代码中O=a.*I+b/255 ,b除以255原因是: 灰度数据有两种表式方法:一种是用unit8类型,取值0255;另一种是double类型,取值01。两者之间相差255倍。 就这段代码而言,I刚读入时是unit8类型,在第2句转换为double,所以后面涉及到与它进行运算的时候,为了统一,都要转换到0~1的范围,所以要除255。
非线性点运算
非线性点运算是指输入与输出为非线性关系,常见的非线性灰度变换为对数变换和幂次变换,对数变换一般形式为:
其中c为一常数,并假设r≥0.此变换使窄带低灰度输入图像映射为宽带输出值,相对的是输出灰度的 高调整。
代码:
I=im2double(I);
figure(1);subplot(1,2,1);
imshow(I);
title('原图像','fontsize',7);
c=2;
O=c*log(1+I);
figure(1);subplot(1,2,2);imshow(O);
title('c>0','fontsize',7);
运行结果:
幂次变换一般形式:s=cr^γ
幂级数γ部分值把窄带暗值映射到宽带输出值
当γ<1,此时扩展低灰度级,压缩高灰度级,在正比函数上方,使图像变亮;
当γ>1,此时扩展高灰度级,压缩低灰度级,在正比函数下方,使图像变暗。
程序:
I=imread('1.jpg');
subplot(2,2,1);
imshow(I);
title('原图像','fontsize',9);
subplot(2,2,2);
imshow(imadjust(I,[],[],0.1));
title('Gamma=0.1');
subplot(2,2,3);
imshow(imadjust(I,[],[],1));
title('Gamma=1');
subplot(2,2,4);
imshow(imadjust(I,[],[],10));
title('Gamma=10');
运行结果:
代数运算
代数运算是指对两幅或两幅以上的图像进行点对点的加、减、乘、除运算而得到目标图像的运算。
加法运算
对M幅图片进行求平均,使图像每一点的信噪比提高了M倍。加法运算可以用来降低图片的噪声。
图片的信噪比增加了M倍再取平均,对原图片来说没有影响,只会降低噪声。
T(x,y) = f(x,y) + g(x,y)
f:原图,g:噪声
I=imread('1.jpg');
J=imnoise(I,'gaussian',0.02);
subplot(131);imshow(I);title('原图')
subplot(132);imshow(J);title('加噪')
for i=1:100
J=imnoise(I,'gaussian',0.02);
J1=im2double(J);
J2=J1;
J2=J2+J1;
end
J2=J2/101;
subplot(133);imshow(J2);title('去噪');
运行结果:
减法运算
减法运算又称为图像差分运算,主要用于提取噪声,在短时间内认为背景是固定的,可用差分法检测变换的或运动的物体。
示例:
I=imread('1.jpg');
J=imnoise(I,'gaussian',0,0.02);%给图像加高斯噪声
K=imsubtract(I,J);%原始图片与添加噪声的图片相减从而提取出噪声
K1=255-K;
figure;imshow(I);title('原始图像');
figure;imshow(J);title('有噪声图像');
figure;imshow(K1);title('提取噪声')
在进行有噪声运算时,一般会需要一些运算的时间。
运行结果:
注:加噪声
加高斯噪声:
1、J = imnoise(I,'gaussian',0,10);
2、使用randn加高斯噪声:
I=imread('E:\my photo and video\2.jpg');
J=rgb2gray(I);
y=randn(size(J));
y=y/std(y);
y=y-mean(y);
a=0;
b=sqrt(5);
y=a+b*y;
y=uint8(I);
y=y+I;
figure;imshow(I);
figure;imshow(y);
3、加椒盐噪声:J= imnoise(I,'salt & pepper',0.1);
乘法运算
简单的乘法运算可以用来改变灰度级,实现灰度级变换,也可以用来遮住图像的某些部分。
I=imread('1.jpg');
J=immultiply(I,1.2);
K=immultiply(I,2);
subplot(131);imshow(I);title('原始图像');
subplot(132);imshow(J);title('x1.2');
subplot(133);imshow(K);title('x2');
运行结果:
除法运算
简单的除法运算可用于改变图像灰度级,典型运用是比值图像处理。可用于校正成像设备的非线性影响,在特殊形态图像(如CT为代表的医学图像)中用到。
逻辑运算
常见的逻辑运算有与、或、非,其主要针对二值图像。
A=zeros(128);
A(40:67,60:100)=1;
figure(1);imshow(A);title('A');
B=zeros(128);B(50:80,40:70)=1;
figure(2);imshow(B);title('B');
C=and(A,B);figure(3);imshow(C);title('A and B');
D=or(A,B);figure(4);imshow(D);title('A or B');
E=not(A,B);fgure(5);imshow(E);title('A not B');
运行结果:
几何运算
从变换的性质来分,几何变换可以分为图像的位置变换(平移、镜像、旋转)、形状变换(放大、缩小)及图像的复合变换等。一个几何运算需要两个独立的算法,首先需要一个算法定义空间变换,用它描述每个像素如何从其初始位置移动到终止位置,即每个像素的运动。同时还需要一个算法用于灰度级的差值。
图像平移
MATLAB自带函数translate(SE,[y x])
功能:
在结构元素SE上进行y和x方向的位移 正数对应右移和下移
A=imread('1.jpg');
se=translate(strel(1),[50 50]);
%向右向下平移50,50像素坐标
B=imdilate(A,se);%形态学膨胀
figure;
subplot(1,2,1),subimage(A);
title('原图像')
subplot(1,2,2),subimage(B);
title('图像平移')
另一种写法:
I=imread('1.jpg');
subplot(121);
imshow(I);
title('原图像');
[M,N]=size(I);
g=zeros(M,N);
a=20;b=20;
for i=1:M
for j=1:N
if((i-a>0)&(i-a<M)&(j-b>0)&(j-b<N))
g(i,j)=I(i-a,j-b);
else
g(i,j)=0;
end
end
end
subplot(122);imshow(uint8(g));title('平移后的图像')
这种更偏向理论写法,M,N分别是图像长和宽
用for循环让原图中每个像素向右下角走20像素
运行结果(第一种):
图像旋转:
使用MATLAB自带函数 imrotate(img,30);
功能:
将图像img逆时针旋转30°
MATLAB在进行图像操作时,是将其存放在数组中,而数组坐标必须为整数,若对图像进行旋转、缩放等操作,计算得到的坐标不一定为整数,这时候就需要进行插值。MATLAB常用插值方法有三种:
- 最近邻插值 ‘nearest’
- 双线性插值 ‘bilinear’
- 三次卷积插值 ‘bicubic’
还可以:
imrotation用法:
imrotation(A,angle,’ method’,‘BBox’)
1、angle是旋转的角度,在matlab默认的是逆时针旋转的。
2、method 就是实现旋转用的方法。有三种:最邻近插值法 、双线性插值法、 三次卷积插值法,英语表示就是 ‘nearest’ ‘bilinear’ ‘bicubic’
3、bbox主要分为2种,一个是‘loose’ 另外一个是‘crop’
loose 就是宽松的意思 顾名思义就是说 图像旋转后 系统会给予一个宽松的环境去匹配它,这样得到的图片就是一个完整的图片
crop 就是剪切,为什么旋转后图像变小了,因为matlab默认的是crop 超过图片原来大小的部分被crop了
A=imread('1.jpg');
B=imrotate(A,30); %旋转30°
C=imrotate(A,30,'crop'); %旋转30°,并剪切图像,使得到的图像和原图像大小一致
%若不说明插值方法,默认为最近邻插值
D=imrotate(A,30,'bilinear','crop');
%双线性插值法旋转30°,并剪切图像,使得到的图像和原图像大小一致
figure;
subplot(2,2,1),imshow(A);
title('原图像')
subplot(2,2,2),imshow(B);
title('图像旋转(保留全部图像信息)')
subplot(2,2,3),imshow(C);
title('图像旋转(大小不变)')
subplot(2,2,4),imshow(D);
title('图像旋转(双线性插值)')
运行结果:
图像缩放
imresize()
图像镜像
图像的镜像是指原始图像相对于某一参考面旋转180°的图像。
水平镜像
以图像垂直中轴线为中心,将图像分为左右两部分镜像对称变换
I=imread('1.jpg');
I = rgb2gray(I);
subplot(121);
imshow(I);
title('原始图像');
[M,N]=size(I);
g=zeros(M,N);
for i=1:M
for j=1:N
g(i,j)=I(i,N-j+1);
end
end
subplot(122);imshow(uint8(g));title('水平镜像')
运行结果:
垂直镜像
I=imread('1.jpg');
I = rgb2gray(I);
subplot(121);
imshow(I);
title('原图像');
[M,N]=size(I);
g=zeros(M,N);
a=20;b=20;
for i=1:M
for j=1:N
if((M-i>0)&(N-j>0))
g(i,j)=I(M-i,N-j);
else
g(i,j)=0;
end
end
end
subplot(122);imshow(uint8(g));title('垂直镜像图像')
原理几乎都相同,对图片的每个像素进行操作
垂直镜像 x,y轴都变化
运行效果: