图像的基本运算

图像像素的距离

在说基本运算之前,先把图像像素间的距离说一下(不想再写一篇了🤣)

邻域

相邻像素——4邻域

  • 4邻域:像素p(x,y)的4邻域是: (x+1,y);(x-1,y);(x,y+1);(x,y-1)
  • 用N4(p)表示像素p的4邻域

image-20230314165042002

相邻像素——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邻域 :

image-20230314165146607

相邻像素——8邻域

  • 8邻域定义:像素p(x,y)的8邻域是:4邻域的点 + D邻域的点
  • 用N8§表示像素p的8邻域。
    -N8(p)= N4(p)+ ND(p)

image-20230314165232949

邻接性

  • 邻接性是描述区域和边界的重要概念
  • 两个像素邻接的两个必要条件是:
    两个像素的位置是否相邻
    两个像素的灰度值是否满足特定的相似性准则(或者是否相等)都属于V

像素间的邻接性——4邻接

对于具有值V的像素p和q,如果q在集合N4(p)中,则称这两个像素是4邻接的。

image-20230314165408072

像素间的邻接性——8邻接

对于具有值V的像素p和q,如果q在集合N8(p)中,则称这两个像素是8邻接的 。

image-20230314165437623

像素间的邻接性——m邻接

对于具有值V的像素p和q,如果:

  • q在集合N4(p)中,或
  • q在集合ND(p)中,并且N4(p)与N4(q)的交集为空(没有值V的像素)。则称这两个像素是m邻接的,即4邻接和D邻接的混合连通

image-20230314165845323

以上也是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)应满足的如下条件:

  1. D(p , q) ≥ 0.(当且仅当p = q);
  2. D(p , q) = D(q , p);
  3. D(p , q) + D(q , z) ≥ D(p , z);

像素距离的分类及计算方法

像素p(x,y)和q(s,t)间的欧式距离定义:

image-20230314170508480

欧式距离就是数学中学到的直线距离公式

像素p(x,y)和q(s,t)间的D4距离(城区距离)定义:

image-20230314170520546

image-20230314170959966

D4模型只能走横竖两个方向,不能走斜向。两个点的距离就是横向加竖向的距离之和。

像素p(x,y)和q(s,t)间的D8(街区距离)距离定义:

image-20230314170532518

D8的模型就是围着P点的所有元素都是相邻的,也就是它下一步可以走到包围它的八个点的任何一个,也就是横竖和斜向。

对于可以横竖和斜向走的最短距离,就是横向或竖向的距离的最大值。

image-20230314171222545

图像的基本运算

图像处理是建立在各种算法基础上的处理方法,图像基本运算主要包括点运算、代数运算(加、减、乘、除)、逻辑运算(与、或、非)和几何运算(平移、镜像、旋转、缩放)。这些基本运算都具有十分重要的意义,如:改变输入图像的灰度级、降低图像的噪声、进行各种各样的几何变换。

点运算

点运算是对图像的每个像素点的灰度值按一定的映射关系运算,得到一福新图片的过程。由于点运算能够有规律的改变像素点的灰度值,故也被称为对比度增强或灰度变换。

线性点运算

线性点运算是指输入图像的灰度级与输出图像呈线性关系。

image-20230314171922700

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);

运行结果:

image-20230314174220654

注:代码中O=a.*I+b/255 ,b除以255原因是: 灰度数据有两种表式方法:一种是用unit8类型,取值0255;另一种是double类型,取值01。两者之间相差255倍。 就这段代码而言,I刚读入时是unit8类型,在第2句转换为double,所以后面涉及到与它进行运算的时候,为了统一,都要转换到0~1的范围,所以要除255。

非线性点运算

非线性点运算是指输入与输出为非线性关系,常见的非线性灰度变换为对数变换和幂次变换,对数变换一般形式为:

image-20230314174345061

其中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);

运行结果:

image-20230314174553582

幂次变换一般形式:s=cr^γ

幂级数γ部分值把窄带暗值映射到宽带输出值

当γ<1,此时扩展低灰度级,压缩高灰度级,在正比函数上方,使图像变亮;

当γ>1,此时扩展高灰度级,压缩低灰度级,在正比函数下方,使图像变暗。

img

程序:

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');

运行结果:

image-20230314175224137

代数运算

代数运算是指对两幅或两幅以上的图像进行点对点的加、减、乘、除运算而得到目标图像的运算。

加法运算

对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('去噪');

运行结果:

image-20230314180830308

减法运算

减法运算又称为图像差分运算,主要用于提取噪声,在短时间内认为背景是固定的,可用差分法检测变换的或运动的物体。

示例:

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('提取噪声')

在进行有噪声运算时,一般会需要一些运算的时间。

运行结果:

image-20230314181607364

注:加噪声

加高斯噪声:

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');

运行结果:

image-20230314181847885

除法运算

简单的除法运算可用于改变图像灰度级,典型运用是比值图像处理。可用于校正成像设备的非线性影响,在特殊形态图像(如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');

运行结果:

image-20230314182414904

几何运算

从变换的性质来分,几何变换可以分为图像的位置变换(平移、镜像、旋转)、形状变换(放大、缩小)及图像的复合变换等。一个几何运算需要两个独立的算法,首先需要一个算法定义空间变换,用它描述每个像素如何从其初始位置移动到终止位置,即每个像素的运动。同时还需要一个算法用于灰度级的差值。

图像平移

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像素

运行结果(第一种):

image-20230314182939545

图像旋转:

使用MATLAB自带函数 imrotate(img,30);
功能:
将图像img逆时针旋转30°

MATLAB在进行图像操作时,是将其存放在数组中,而数组坐标必须为整数,若对图像进行旋转、缩放等操作,计算得到的坐标不一定为整数,这时候就需要进行插值。MATLAB常用插值方法有三种:

  1. 最近邻插值 ‘nearest’
  2. 双线性插值 ‘bilinear’
  3. 三次卷积插值 ‘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('图像旋转(双线性插值)')

运行结果:

image-20230314183432258

图像缩放

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('水平镜像')

运行结果:

image-20230314185651240

垂直镜像
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轴都变化

运行效果:

image-20230314190032737

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜小田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值