最近在学习图像处理,也就分享几个最近学习的初级图像处理代码,很low, 看不上的大佬们还望勿喷
灰度线性变化
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\1.png');
mingray=min(min(image));
maxgray=max(max(image));
minshow=0;
maxshow=255;
iamgeshow=(maxshow-minshow)/(maxgray-mingray)*(image-mingray)+minshow;
subplot(1,2,1);
imshow(image);
title('\fontsize{16}原图像');
subplot(1,2,2);
imshow(iamgeshow);
title('\fontsize{16}新图像');
由于我们原图的最大像素值也是255,最小的是0,所以相当于线性变化没有效果
当我把minshow也就是变化之后的最小值改为100,可以看到,明显有变化
灰度非线性变化
这里就只是区别于之前的线性,可以利用例如开方之类的
这里我们以开方为例
因为0-255,开方以后为0-16,我们在*16就恢复到0-255
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\1.png');
imageshow=image;
for i=1:size(image,1)
for j=1:size(image,2)
imageshow(i,j)=sqrt(double(image(i,j)))*16;
end
end
subplot(1,2,1);
imshow(image);
title('\fontsize{16}原图像');
subplot(1,2,2);
imshow(imageshow);
title('\fontsize{16}新图像');
锯齿形灰度拉伸
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\1.png');
mingray=min(min(image));
maxgray=max(max(image));
imageshow=image;
minshow=0;
maxshow=255;
divide_num=4;%这里是把图像分成了若干个区域,每个区域都线性映射到0-255
divide_length=floor((maxgray-mingray)/divide_num);
min_gray=zeros(1,divide_num);%这两个分别保存每段区间对应的最小值和最大值,先生成一个对应阶的0矩阵
max_gray=zeros(1,divide_num);
min_gray(1)=mingray;
for i=2:divide_num
min_gray(i)=min_gray(i-1)+divide_length;
end
max_gray(divide_num)=maxgray;
for i=1:divide_num-1
max_gray(i)=min_gray(i+1);
end
for i=1:size(image,1)
for j=1:size(image,2)
for m=1:divide_num
if image(i,j)>=min_gray(m) && image(i,j)<max_gray(m)
break;
end
end
imageshow(i,j)=(maxshow-minshow)/(max_gray(m)-min_gray(m))*(image(i,j)-min_gray(m))+minshow;
end
end
subplot(1,2,1);
imshow(image);
title('\fontsize{16}原图像');
subplot(1,2,2);
imshow(imageshow);
title('\fontsize{16}新图像');
可以看到原来图片中间的灰色部分,突然产生了明显的突变
灰度直方图
利用系统函数
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\1.png');
figure(1);
imhist(image);
灰度直方图和累计灰度直方图
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\3.png');
imageGray=0:255;
imageBar=imageGray;
for i=1:size(imageGray,2)
imageBar(i)=sum(sum(image==imageGray(i)));
end
imageBar=imageBar/(size(image,1)*size(image,2));
Sumbar=imageBar;
for i=2:size(Sumbar,2)
Sumbar(i)=Sumbar(i-1)+imageBar(i);
end
subplot(1,2,1);
bar(imageGray,imageBar);
title('\fontsize{16}直方图');
subplot(1,2,2);
bar(imageGray,Sumbar);
title('\fontsize{16}累积直方图');
直方图均衡
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\3.png');
imageGray=0:255;
imageBar=imageGray;
for i=1:size(imageGray,2)
imageBar(i)=sum(sum(image==imageGray(i)));
end
imageBar=imageBar/(size(image,1)*size(image,2));
Sumbar=imageBar;
for i=2:size(Sumbar,2)
Sumbar(i)=Sumbar(i-1)+imageBar(i);
end
hd=zeros(1,256);
imagenew=image;
for i=1:size(image,1)
for j=1:size(image,2)
imagenew(i,j)=Sumbar(image(i,j)+1)*255;
end
end
imageBar_new=0:255;
for i=1:size(imageGray,2)
imageBar_new(i)=sum(sum(imagenew==imageGray(i)));
end
imageBar_new=imageBar_new/(size(imagenew,1)*size(imagenew,2));
subplot(2,2,1);
imshow(image);
title('\fontsize{16}原图');
subplot(2,2,2);
bar(imageGray,imageBar);
title('\fontsize{16}原图的直方图');
subplot(2,2,3);
imshow(imagenew);
title('\fontsize{16}新图');
subplot(2,2,4);
bar(imageGray,imageBar_new);
title('\fontsize{16}新图的直方图');
梯度法
clear;
clc;
image=imread('D:\MATLAB\MATLAB\pictrue\1.png');
imageout=image;
for i1=1:size(image,1)-1
for i2=1:size(image,2)-1
c=image(i1,i2);
c1=image(i1,i2+1);
c2=image(i1+1,i2);
b=abs(c-c1)+abs(c-c2);
if b>10
imageout(i1,i2)=b;
else imageout(i1,i2)=128;
end
end
end
subplot(1,2,1);
imshow(image);
title('\fontsize{16}原图像');
subplot(1,2,2);
imshow(imageout);
title('\fontsize{16}新图像');
卷积函数
function y = juanji(a,b)
%a为积分对象,b为卷积核
y=a;
b_length_y=(size(b,2)-1)/2;
b_length_x=(size(b,1)-1)/2;
for i=b_length_x+1:size(a,1)-b_length_x
for j =b_length_y+1:size(a,2)-b_length_y
y(i,j)=sum(sum(a(i-b_length_x:i+b_length_x,j-b_length_y:j+b_length_y).*b));
end
end
end
伪彩色变化
I=imread(".\pictrue\1.png");
[m,n]=size(I);
hd=zeros(256,1);
for j=1:m
for i=1:n
k=I(j,i);
hd(k+1)=hd(k+1)+1;
end
end
p=zeros(256,1);
q=zeros(256,1);
for i=1:256
p(i)=hd(i)/(m*n);
for j=1:i
q(i)=q(i)+p(j);
end
q(i)=uint8(q(i)*100)/100;
end
hd1=zeros(256,1);
for j=1:m
for i=1:n
k=q(I(j,i)+1)*255;
hd1(k)=hd1(k)+1;
end
end
for i=1:m
for j=1:n
if I(i,j)>=0 &I(i,j)<16
new(i,j,1)=0;
new(i,j,2)=0;
new(i,j,3)=0;
elseif I(i,j)>=16 &I(i,j)<32
new(i,j,1)=0;
new(i,j,2)=0;
new(i,j,3)=191;
elseif I(i,j)>=32 &I(i,j)<48
new(i,j,1)=0;
new(i,j,2)=191;
new(i,j,3)=0;
elseif I(i,j)>=48 &I(i,j)<64
new(i,j,1)=0;
new(i,j,2)=191;
new(i,j,3)=191;
elseif I(i,j)>=64 &I(i,j)<80
new(i,j,1)=191;
new(i,j,2)=0;
new(i,j,3)=0;
elseif I(i,j)>=80 &I(i,j)<96
new(i,j,1)=191;
new(i,j,2)=0;
new(i,j,3)=191;
elseif I(i,j)>=96 &I(i,j)<112
new(i,j,1)=191;
new(i,j,2)=191;
new(i,j,3)=0;
elseif I(i,j)>=112 &I(i,j)<128
new(i,j,1)=191;
new(i,j,2)=191;
new(i,j,3)=191;
elseif I(i,j)>=128 &I(i,j)<144
new(i,j,1)=64;
new(i,j,2)=64;
new(i,j,3)=64;
elseif I(i,j)>=144 &I(i,j)<160
new(i,j,1)=0;
new(i,j,2)=0;
new(i,j,3)=255;
elseif I(i,j)>=160 &I(i,j)<176
new(i,j,1)=0;
new(i,j,2)=255;
new(i,j,3)=0;
elseif I(i,j)>=176 &I(i,j)<192
new(i,j,1)=0;
new(i,j,2)=255;
new(i,j,3)=255;
elseif I(i,j)>=192 &I(i,j)<208
new(i,j,1)=255;
new(i,j,2)=0;
new(i,j,3)=0;
elseif I(i,j)>208 &I(i,j)<224
new(i,j,1)=255;
new(i,j,2)=0;
new(i,j,3)=255;
elseif I(i,j)>=224 &I(i,j)<240
new(i,j,1)=255;
new(i,j,2)=255;
new(i,j,3)=0;
elseif I(i,j)>=240 &I(i,j)<256
new(i,j,1)=255;
new(i,j,2)=255;
new(i,j,3)=255;
end
end
end
subplot(1,2,1);
imshow(I);
title("原图像");
subplot(1,2,2);
imshow(new);
title("伪彩色");