matlab图像处理基础,不调用内部函数

    xiaoxiao2025-05-27  12

    目录

    matlab中不调用内部函数做简单图像处理1、图像读取、显示、画横线,对角线、圆2、图片缩小、剪切、扩大画布、拼接3、图片灰度化、二值化、图片亮度调整、对比度图4、图像边缘检测 总结

    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('函数调用的边缘图');

    结果: 这里第二幅图是没有二值化的边缘图,边缘看着就不是特别清晰,可以再经过一个二值化,效果就要好一些。但是最好的效果还是调用内部函数得到的边缘图。

    总结

    图像处理是现在比较火的一个研究方向,同时也是比较难的一个方向,掌握好图像处理的基础对之后的学习是很有帮助的,虽然以后的很多时候都是调用内部函数,而不是自己编写代码,但是了解需要调用的函数的内部原理对之后的学习是很有帮助的。

    最新回复(0)