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

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

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

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值