matlab中不调用内部函数做简单图像处理
1、图像读取、显示、画横线,对角线、圆
图片的读取和显示是比较简单了,这里就不多做介绍。这里划画线表示的是在图片的1/2高处画一条横线,这个也比较简单,画对角线时注意,不能想当然的直接用一个遍历,把x和y的值变成其他颜色,因为图片大多不是正方形,如果用这种方法得到的不是真正的对角线。应该是根据x和y的方程来算:y=(w-1)/(1-x)*(i-x)+1。这样才能得到正确的对角线。画圆时也是根据圆性质:圆上的点到圆心的距离相等。
注意:第一个代码这里读取和得到图片的shape,之后的代码中不再显示。
代码:
clc
clear
close all;
kobe = imread('jp1.jpg'); %读取图片
new_kobe = kobe;
subplot(231);imshow(kobe);title('原图'); %在子图里面显示,并为图片定义名字
g2=im2bw(kobe,0.5);
[h,w]=size(g2); %得到图片的长和宽
midh = round(h/2); %得到高的一半,round()是向上取整,因为除之后可能会出现小数
midw = round(w/2);
L = round(h/5);
% 求横线
for i=1:w
kobe(midh,i,1)=255;
kobe(midh,i,2)=255;
end
subplot(232);imshow(kobe);title('画横线');
kobe = new_kobe;
for i=1:h
kobe(i,midw,1)=255;
kobe(i,midw,2)=255;
end
subplot(233);imshow(kobe);title('画竖线');
kobe = new_kobe;
for i=1:w
j = round((h-1)/(1-w)*(i-w)+1);
kobe(j,i,1)=255;
kobe(j,i,2)=255;
end
subplot(234); imshow(kobe);title('对角线');
kobe = new_kobe;
for i=1:w
for j = i:h
if abs(midh - round(sqrt((j-midw)^2+(i-midh)^2))>=0) & ...
abs(midh - round(sqrt((j-midw)^2+(i-midh)^2))<2)
kobe(i,j,1)=255;
kobe(i,j,2)=255;
kobe(i,j,3)=255;
end
end
end
subplot(235);imshow(kobe);title('画圆');
结果演示:
这里画圆时不知道出了什么问题,只能画成这种,尝试改变一下半径范围也没用,可能是图片问题,有兴趣可以自己深究。
2、图片缩小、剪切、扩大画布、拼接
图片缩小是在原图像的基础上每个一个(或多个)像素点取值,比如:12345678,就取值成:1357。剪切只要图片中的某一部分。扩大画布就是首先生成一张比图片大的均匀白色图片,然后把彩色图片赋值给大的白色图片,达到扩大画布的效果。拼接就是把两张图片拼接在一起,可以横着也可以竖着,看自己的需要。
代码:
%图片缩小
kobe = new_kobe;
kobe1 = kobe(1:2:h,1:2:w,:);
% kobe1 = imresize(kobe,[50,50],'bilinear');
subplot(232);imshow(kobe1);title('缩小图片');
%剪切
kobe = new_kobe;
kobe4 = kobe(midh-2*L:midh+2*L,midw-2*L:midw+2*L,:);
subplot(233);imshow(kobe4);title('剪切图片');
%扩大画布
kobe = new_kobe;
LH = h+100;
LW = w+100;
kobe5 = uint8(ones(LH,LW,3)*255);
kobe5 (51:50+h,51:50+w,:) = kobe;
subplot(234);imshow(kobe5);title('扩大画布');
% 拼接
kobe = new_kobe;
kobe6 = uint8(ones(2*h,w,3)*255);
kobe6(1:h,:,:) = kobe;
kobe6(h:2*h-1,:,:) = kobe;
subplot(235);imshow(kobe6);title('拼接图片');
结果:
3、图片灰度化、二值化、图片亮度调整、对比度图
图片灰度化:灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。这里使用平均值算法:每个分量相加后取平均值。
二值化:就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。可以预先设置一个阀值,大于这个阀值的就变成白色,小于这个阀值的就变成黑色。
图片亮度调整:简单说就是把图片亮度调暗或调亮。
对比度图:一副图像中,各种不同颜色最亮处和最暗处之间的差别,差别越大对比度越高,这个跟分辨率没有多少关系,只跟最暗和最亮有关系,对比度越高一个图像给人的感觉就越刺眼,更加鲜亮,突出;越低则给人感觉变化不明显,反差就越小。这个概念只是在给定的图像中,与图像中颜色亮度的变化有关。
代码:
%灰度化
%直接调用内部函数
% deal_kobe = rgb2gray(kobe);
kobe = new_kobe;
kobe = double(kobe); %用了这个代码后,显示的时候就要加上uint8
I_kobe = round((kobe(:,:,1)+kobe(:,:,2)+kobe(:,:,3))/3);
kobe(:,:,1)=I_kobe;
kobe(:,:,2) = I_kobe;
kobe(:,:,3) = I_kobe;
% 显示总的
subplot(332);imshow(uint8(I_kobe));title('灰度图');
%单个显示
% imshow(uint8(kobe(:,:,1)));
% imshow(uint8(kobe(:,:,2)));
% imshow(uint8(kobe(:,:,3)));
% 二值化
kobe = new_kobe;
th = 100; %设置一个阀值
I2 = uint8(zeros(h,w));
for i=1:h
for j=1:w
if kobe(i,j,3)>th
I2(i,j)=255;
else
I2(i,j)=0;
end
end
end
subplot(333);imshow(I2);title('二值化图');
%亮度调整
%灰色图
kobe = new_kobe;
% 先变成灰度图
I_kobe = round((kobe(:,:,1)+kobe(:,:,2)+kobe(:,:,3))/3);
% %调亮
I_kobe1 = I_kobe*1.5;
subplot(334);imshow(uint8(I_kobe1));title('变亮');
% %调暗
I_kobe2 = I_kobe*0.5;
subplot(335);imshow(uint8(I_kobe2));title('亮暗');
Ic1 = I_kobe;
T = 128;
for i = 1:h
for j=1:w
if I_kobe(i,j)>T
Ic1(i,j) = Ic1(i,j)*2;
else
Ic1(i,j) = Ic1(i,j)/2;
end
end
end
subplot(336);imshow(uint8(Ic1));title('灰色图片对比度图');
Ic2 = kobe;
kobe=imread('jp1.jpg');
for k = 1:3
for i = 1:h
for j=1:w
if kobe(i,j,k)>T
Ic2(i,j,k) = min(Ic2(i,j,k)*2,255);
else
Ic2(i,j,k) = max(Ic2(i,j,k)/2,0);
end
end
end
end
subplot(337);imshow(uint8(Ic2));title('彩色图片对比度图');
结果:
4、图像边缘检测
边缘图像,是对原始图像进行边缘提取后得到的图像。边缘是图像性区域和另一个属性区域的交接处,是区域属性发生突变的地方,是图像中不确定性最大的地方,也是图像信息最集中的地方,图像的边缘包含着丰富的信息。
直接看代码:
I_kobe = rgb2gray(kobe); %得到灰度图
Id = double(I_kobe);
Ie1 = abs(Id(1:h-1,1:w-1)-Id(2:h,1:w-1));
Ie2 = abs(Id(1:h-1,1:w-1)-Id(1:h-1,2:w));
Ie = min(255,(Ie1+Ie2));
subplot(222);imshow(uint8(Ie));title('没有二值化时的边缘图');
th = 50;
I2 = uint8(zeros(h,w));
for i=1:h-1
for j=1:w-1
if Ie(i,j)>th
Ie(i,j)=255;
else
Ie(i,j)=0;
end
end
end
subplot(223);imshow(uint8(Ie));title('二值化后的边缘图');
%函数调用边缘图
Ie2 = edge(I_kobe,'canny');
subplot(224);imshow(Ie2);title('函数调用的边缘图');
结果:
这里第二幅图是没有二值化的边缘图,边缘看着就不是特别清晰,可以再经过一个二值化,效果就要好一些。但是最好的效果还是调用内部函数得到的边缘图。
总结
图像处理是现在比较火的一个研究方向,同时也是比较难的一个方向,掌握好图像处理的基础对之后的学习是很有帮助的,虽然以后的很多时候都是调用内部函数,而不是自己编写代码,但是了解需要调用的函数的内部原理对之后的学习是很有帮助的。