1、相邻像素
4邻域:像素的上下左右四个方向的像素
8邻域:4邻域+对角的4个
2、连接性和连通性
两个像素可能是4临接的,仅当他们具有同一灰度值时才能说是连通
4临接必8临接,反之不然
m临接必8临接,反之不然
m临接是8临接的变型,介于4临接和8临接之间,以消除8临接中产生的歧义性
1、二值图像
clear;
x=zeros(10,10);
x(2:2:10,2:2:10)=1;
imshow(x)
2、亮度图像
感觉就是灰度图
3、索引图像
索引图像分为两部分,一个数图像数据,一个是调色板,通过图像数据在调色板中找到颜色
4、gbr图
1、线性点运算
s=ar+b
a>1 图像对比度增大
a<1 图像对比度降低
a<0 亮区域边暗 暗的变亮
2、非线性运算
对数运算
幂运算
对数运算可以把小范围的低灰度值映射到较大范围的输出值
过函数imadjust()进行图像灰度的调整
详解连接
J=imadjust( I,[low_in;high_in],[low_out;high_out],gamma) 该gamma参数为映射的方式,默认值为1,即线性映射。当gamma不等于1时为非线性映射
low_in,high_in,low_out,high_out的值必须在0到1之间
低于low_in的值和高于high_in的值被去除
也就是说,低于low_in的值映射成low_out,高于high_in的值映射成high_out
我对该函数的理解:原图灰度值是在0~255之间,现在舍弃low_in255到high_in255 之外的值,再把 中间的值映射到low_out到high_out之间,映射方式相关gamma参数,默认为1,线性映射
如果gamma小于1,映射被加权到更高的输出值。如果gamma大于1,映射被加权到更低的输出值
RGB图像转化为灰度图片
灰度图转二值化,第一个参数为图像,第二个为阈值
如果输入图像不是灰度图像, im2bw 首先将图像转换为灰度图像,然后通过阈值将灰度图像转换成二进制图像。
代数运算是指对两幅或两幅以上的图像进行点对点的加、减、乘、除运算而得到目标图像的运算。
1、加运算
加运算通常用于平均值降噪等多种场合
对多副图像进行平均,幅度信噪比会随着图像数目的增加而增大。
2、减运算
减运算又称为差分运算,将同一景物在不同时间拍摄的图像或同一景物在不同波段的图像相减,这就是差影法。差影图像提供了图像间的差值信息,能用于指导动态监测、运动目标的检测和跟踪、图像背景的消除和目标识别等。
图像的加减,用法类似
两种用法
K=imadd(I,J); %进行两幅图像的加法运算
J=imadd(I,50); %每个像素值增加50
详解连接
通过不同的参数可以添加各种噪声
高斯、椒盐、泊松等等
简单的乘法运算可用来改变图像的灰度级,实现灰度级变换。乘法运算也可以用来遮住图像的某些部分,典型应用是用于获得掩模图像。
简单的触发运算可以用于改变图像的灰度级。触发运算的典型运用是比值图像处理。(触发运算可以用于校正成像设备的非线性影响,在特殊形态的图像处理中(CT医学图像)用到)。
除法使用 imdivide()函数
and()
or()
not()
主要针对二值图像,运用这种方法可以为图像提供模板。
通过histogram()函数可以绘制直方图
如下:
可以看得出图片整体偏亮,在图像均衡上有很多应用
I = imread('bbb.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(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('平移后的图像');
注意哈,如果是bgr图,则要转为灰度图,不转的话,平移后会出现三个图,需要彩色图平移的话参考下面代码:
I = imread('bbb.jpg');
subplot(121);
imshow(I);
title('原始图像');
[M,N,u]=size(I);
g=zeros(M,N,3);
a=20;b=20;
for i=1:M
for j=1:N
for k=1:3
if(i-a>0)&(i-a<M)&(j-b>0)&(j-b<N)
g(i,j,k)=I(i-a,j-b,k);
else
g(i,j,k)=0;
end
end
end
end
subplot(122);imshow(uint8(g));title('平移后的图像');
注意:[M,N,u]=size(I);
这里一定要加个u,否则N会是1024x3
imtotate() 函数
摘自 此处
B=imrotate(A,angle),将图像A围绕其中心点进行angle角度的逆时针旋转。
如果想要顺时针旋转的话,则角度取负值,-angle。angle和-(360-angle)旋转角度是一致的
B=imrotate(A,angle,method),利用指定的插值方法method进行图像A的旋转,method是文本字符串,需要引号引出,默认值用大括号{}括起来。
method包括:
{‘nearest’}最临近插值-默认值
'bilinear’双线性的
'bicubic’双三次的
B=imrotate(A,angle,method,bbox),bbox指定返回图像的尺寸。bbox是文本字符串,默认值需要用大括号{}括起来。
bbox包括:
'crop’输出的图像B和输入的图像A保持一致的尺寸,裁剪旋转的图像至合适的大小
{‘loose’}输出足够容纳整个旋转图像的图像B,图像B通常比图像A大-默认值
gpuarrayB=imrotate(gpuarrayA,),通过图形处理器GPU进行旋转操作,gpuarrayA是一个gpuArray对象,其包括一幅灰度或二值图像。输出图像也是一个gpuArrary对象。该句法的使用需要通过并行计算工具箱来实现。
最近邻法当两像素间灰度误差很大时,会产生较大误差,计算量小,很有可能产生马赛克效应
双线性插值法是对最近邻法改进的一种算法,即线性内插法,一般可以的到令人满意的效果,但这种方法具有低通滤波的效应,使高频分量收到损失,图像轮廓模糊。
三次线性内插法考虑周围16个邻点的灰度值对它的影响,可以精确的修复原函数,此方法计算量大,精度高,能够保持较好的图像边缘。
还是再说下imshow(A,[5 50])
比如一幅图像,数值是从1到1000之间的数,该函数功能就是显示的时候吧小于5的变成0,大于50的变成255,突出显示5到50之间的数
%构造原始图像
I=zeros(256,256);I(28:228,108:148)=1;subplot(1,4,1);imshow(I)
%求原始图像的傅里叶频谱
J=fft2(I); F=abs(J);J1=fftshift(F);
subplot(1,4,2);imshow(J1,[0 255])
%对原始图像进行旋转
J=imrotate(I,315,'bilinear','crop'); subplot(1,4,3);imshow(J)
%求旋转后图像的傅里叶频谱
J1=fft2(J);F=abs(J1);J2=fftshift(F);
subplot(1,4,4);imshow(J2,[5 50])
尺度变换
I=zeros(256,256);I(8:248,110:136)=5;
figure(1);imshow(I)
%原始图像的傅里叶频谱
J3=fft2(I);F2=abs(J3);J4=fftshift(F2);
figure(2);imshow(J4,[5 30])
%乘以比例尺度
a=0.1;
for i=1:256
for j=1:256
I(i,j)=I(i,j)*a;
end
end
%比例尺度展宽后的傅里叶频谱
J2=fft2(I);F1=abs(J2);J3=fftshift(F1);
figure(3);imshow(J3,[5 30])
中央低频成分代表了图像的平均亮度
有点蒙蔽,imshow(log(abs§) 有时候得log,有时候不用,
使用的时候是 对幅值做对数变换,以压缩动态范围
看傅里叶公式,会发现乘了 e^-j2 π \pi π(ux+vy)
所以在显示的时候要log
abs是求幅度 angle是求相位
通过幅度谱和相位谱可以还原原图像
幅度谱又叫频率谱,是图像增强中关心的重要对象,频域下的每一点(u,v)的幅度|F(u,v)|可用来表示该频率的正弦平面波在叠加中所占的比例,幅度谱直接反映频率信息,是频域滤波的重要依据。
可以这样理解,水平方向的边缘可以看做在竖直方向上的灰度值的矩形脉冲,这样的矩形脉冲可以分解为无数个竖直方向正弦平面波的叠加,从而对应频域图像中的垂直亮线。
交换相位谱后,反变换之后得到的图像内容与其相位谱对应的图像一直,相位谱决定图像结构,幅度谱决定图像明暗、灰度变化趋势,幅度谱反映了图像整体上各个方向的频率分量的相对强度
h = fspecial(type)
h = fspecial('average',hsize)
h = fspecial('disk',radius)
h = fspecial('gaussian',hsize,sigma)
h = fspecial('laplacian',alpha)
h = fspecial('log',hsize,sigma)
h = fspecial('motion',len,theta)
h = fspecial('prewitt')
h = fspecial('sobel')
如:h = fspecial(‘sobel’)
1 2 1
0 0 0
-1 -2 -1
F(0,0)实际上是图像中全部像素的灰度之和,
理想低通滤波器:截止频率非常低时,只有非常靠近原点的低频成分能够通过,图像模糊严重;截止频率越高,通过的频率成分就越多,图像模糊程度越小,所获得的图像也就越接近图像。
图像增强可以分为两大类,空间与方法和频域方法。空间域指图像平面本身,这类方法是以对图像像素直接处理为基础的。频率域处理事修改图像的傅里叶变换为基础
1、空间域处理:点处理 模板处理 邻域处理
2、频率域处理: 高、低通滤波 同态滤波等
哟西,简单明了
直方图均衡化的实质是减少图像的灰度级,以换取对比度增大,在均衡过程中,原来的直方图上频数较小的灰度级数被归入很少几个或一个灰度级内,故得不到增强,若这些灰度级所构成的图像的细节比较重要,则需采用局部区域直方图均衡
1)局部平滑法
对该像素周围点像素相加再平均
定理:设图像中的噪声是随机不相关的加性噪声,窗口内各噪声点是独立同分布的,经过上述平滑后,信号与噪声的方差比可望提高(2s+1)(2t+1)倍
img=rgb2gray(imread('dog.jpg'));
subplot(131);imshow(img);
img_noise=(imnoise(img,'salt & pepper',0.06));
subplot(132);imshow(img_noise);
img_smoothed=imfilter(img_noise,fspecial('average',5));
subplot(133);imshow(img_smoothed);
·
看到很多图像的数据都把图像转为double类型
原因:matlab读入图像的数据是uint8,而matlab中数值一般采用double型(64位)存储和运算。 所以要先将图像转为double格式的才能运算, 如果不转换,计算会产生溢出。
详解
eg:fspecial(‘average’,5);
返回大小为 5的平均值滤波器 h
查看返回值是一个5x5的double的二维矩阵
详解
功能:对任意类型数组或多维图像进行滤波。
用法:B = imfilter(A,H)
B = imfilter(A,H,option1,option2,…)
或写作g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f为输入图像,w为滤波掩模,g为滤波后图像。filtering_mode用于指定在滤波过程中是使用“相关”还是“卷积”。boundary_options用于处理边界充零问题,边界的大小由滤波器的大小确定。
采用局部平滑处理算法简单,但是在降低噪声的同时也使图像边模糊了,特别是图像的边缘处和细节处。而且邻域越大,图像去噪能力增强的同时,模糊程度严重
超限像素平滑法 && 灰度最相近的K个邻点平均法
方法2: 超限像素平滑法的实现
将f(x,y)和邻域平均g(x,y)差的绝对值与选定的阈值进行比较,根据结果决定改点是不变还是取平均值
%超限像素平滑法
I=imread('dog.jpg');
img = im2gray(I);
subplot(141), imshow(img);
title('原图');
[m,n] = size(img);
l = 3; %模板尺寸
L=ones(l);
S=ones(m-l+1,n-l+1);
img=imnoise(img,'salt & pepper',0.05);
for i=1:m-l+1
for j=1:n-l+1
S(i,j)=sum(sum(img(i:i+l-1,j:j+l-1)))/(l*l); %求平均
end
end
subplot(142),imshow(S,[]);
S=uint8(S);
%P=imnoise(img,'salt & pepper',0.05);
%subplot(143),imshow(P,[]);
T=30;%设置阈值
P=img;
A=P;
for i=1:m-2
for j=1:n-2
if(abs(P(i,j)-S(i,j))>T)
A(i,j)=S(i,j);
else
A(i,j)=A(i,j);
end
end
end
subplot(144),imshow(A);
从实验结果看,效果并不理想,,不知道哪的问题
Matlab中显示图像imshow(A)与imshow(A,[])的区别
在matlab中,为了保证精度,经过了运算的图像矩阵f,其数据类型会从uint8型变成double型,imshow()显示图像时对double型认为是在0~1范围内,即大于1时都显示为白色,imshow显示uint8型时范围为0`255
imshow(f,[ ]): 是将f的最大值和最小值分别映射到0~255之间的标准灰度值
double( img)就是简单的数据类型转换,将无符号整型转换为双精度浮点型double,但是数据大小没有变化,原本数据是0255之间,转化后还是0255。例如原来是255,那么转换后为255.0,小数位0个数是由double数据长度决定,实际数据大小还是255,只不过这个255已经是double类型空间存储了,再增加不会发生溢出情况。而im2double(img)则不仅仅是将uint8转换到double类型,而且把数据大小从0255映射到01区间。
腐蚀原理:让原本位于原点的结构元素S在整个Z2 平面上移动,如果当S的原点平移至z点时S能够完全包含于A中,则所有这样的z点构成的集合为S对A的腐蚀图像
I = imread('膨胀腐蚀.png');
img = im2gray(I);
img = double(img);
imshow(img);
se = strel('line',6,30);
erodedBW = imerode(img,se);
imshow(erodedBW);
可以看到,横的被腐蚀了,改变SE的参数可以改变腐蚀效果
腐蚀能够哦消融物体的边界,而具体的腐蚀结果与图像本身和结构元素的形状有关:如果物体整体上大于结构元素,腐蚀结构是使物体“瘦”一圈,这一圈有多大是由结构元素决定的。
如果物体本身小于结构元素,则在腐蚀后的图像中物体将完全消失;如果仅有部分区域小于结构元素,则腐蚀后物体会在细连通处断裂,分离为两部分。
S在蒸锅Z2 平面上移动,当其自身原点平移至z点是S箱规于其自身的原点的映像S和A有公共交集,即S和A至少有一个像素是重叠的,则这样的z点构成集合S对A的膨胀图像
先腐蚀,后膨胀
作用:使图像的轮廓边光滑,断开狭窄的连接和毛刺
imopen
闭运算使轮廓变得光滑,但与开运算相反,它同城能够弥合狭窄的间断,填充小的孔洞。
imclose
击中与击不中变换及其实现
常用于图像的精确定位,是一种形状检测的基本工具。使用 bwhitmiss()函数实现
击中与击不中变换
提取二值化边界,可以先把物体内部信息挖出来,即进行腐蚀,然后原图减去腐蚀后的图像,就得到边界像素了。
I=imread('膨胀腐蚀.png');
imshow(I);
se=strel('square',3);
Ie=imerode(I,se);
Iout=I-Ie;
imshow(Iout);
边界跟踪
im = imread('C:\Users\Mr.zhang\Desktop\轴承检测论文\20210203 - 副本\20210203012002.bmp');
%im = double(im);
H = histeq(im);
注意,这里不要转为 double ,去掉之后就可以了,
注:原图为单通道的灰度图