《MATLAB SYNTAX》第12章 图像处理

这一章介绍MATLAB图像处理的两个好玩的案例:“数硬币”和“蒙娜丽莎的猫”。

(12.1) 数硬币

需求描述:现在有一张图片coins.png,要求用MATLAB数出图片中硬币的个数。

请添加图片描述

把MATLAB的当前文件夹切换到装coins.png的文件目录下,读取图片:

image = imread("coins.png");
imshow(image); %显示图片

在这里插入图片描述

读取后得到一个三维矩阵,783和979分别表示图片的宽度和长度,3表示三个通道R、G、B(三原色,所有的彩色图片都有)。
在这里插入图片描述

接下来把彩色图转换成灰度图:

grayImage = rgb2gray(image);
imshow(grayImage);

在这里插入图片描述

得到一个新的二维矩阵,783和979分别表示图片的宽度和长度,此时无彩色通道。
在这里插入图片描述

现在用图片属性工具查看图片像素点的亮度值:

imtool(grayImage);

在生成的图形窗口的菜单栏中选择Inspect pixel values,可以查看每个像素点的亮度,其中0代表纯黑,255代表纯白。从亮度值的大小分析发现,硬币的亮度大概在大于100的范围内,写以下代码:

bwImage = grayImage > 100;
imshow(bwImage);

在这里插入图片描述

bwImage是一个二维的逻辑型矩阵,逻辑0代表纯黑,逻辑1代表纯白。所以这行代码就实现了让亮度大于100的像素点变成纯白色,小于等于100的变成纯黑色。但是现在的黑白图片有两种瑕疵(噪点),第一是白圈圈里面残留的黑点,第二是黑色区域内的白点。

%去除黑噪点
bwImage = imfill(bwImage,"hole");
imshow(bwImage);

在这里插入图片描述

%去除白噪点
SE = strel('disk',5); %设置腐蚀半径
bwImage = imerode(bwImage,SE); %腐蚀
imshow(bwImage);

在这里插入图片描述

与腐蚀对应的叫膨胀:imdilate,但是在这种情况下腐蚀的效果比膨胀好,来看一下膨胀的效果:

SE = strel('disk',5);
bwImage = imdilate(bwImage,SE);
imshow(bwImage);

在这里插入图片描述

接下来就数出硬币的个数:

[L,num] = bwlabel(bwImage); %返回bwImage中连通区域的个数于num中

完整代码如下:

clc;clear;
image = imread("coins.png");
grayImage = rgb2gray(image);
bwImage = grayImage > 100;
bwImage = imfill(bwImage,"hole");
SE = strel('disk',5);
bwImage = imerode(bwImage,SE);
[L,num] = bwlabel(bwImage);
disp(num); %13

(12.2) 蒙娜丽莎的猫

这一节介绍一种加密、防伪技术——“隐写术”。
这个例子是把一只猫(cat.png)的图片通过像素亮度值叠加的方法藏进蒙娜丽莎(monalisa.png)的图片里面:
在这里插入图片描述
  根据前面我们已经知道,灰度图的像素的亮度值是介于0到255之间的,0代表纯黑,255代表纯白,人的肉眼是分辨不出相邻的两个亮度值对应的亮度大小的(比如145和146,甚至可以说相差10几到20几人眼也很难区分开来)。所以可以把一张图片各像素点的亮度值的个位数全部置为0(在肉眼看来没什么变化),把另一张图片的亮度值划分为0到9之间,然后对两幅图进行叠加就可以将一张图藏进另一张图(但是把图片再分离出来会出现一点细微的失真)。

%图片融合
clc;clear;
monalisa = imread("monalisa.png");
grayMonalisa = rgb2gray(monalisa);
grayMonalisa = idivide(grayMonalisa,10)*10; %将monalisa.png的像素点的亮度个位数变为0
cat = imread("cat.png");
grayCat = rgb2gray(cat);
[h,w] = size(grayMonalisa);
grayCat = imresize(grayCat,[h,w]); %将cat.png的大小转成与monalisa.png的大小一致
grayCat = grayCat * (9 / 255); %将cat.png的像素点的亮度压缩到09的范围内
grayImage = grayMonalisa + grayCat; %图片融合
imshow(grayImage); %如图12.2.1
imwrite(grayImage,"monalisa_cat_gray.png"); %输出.png文件
%图片分离
clc;clear;
grayImage = imread("monalisa_cat_gray.png");
monalisa = idivide(grayImage,10)*10;
cat = grayImage - monalisa;
cat = cat * (255 / 9);
subplot(121);
imshow(monalisa);
subplot(122);
imshow(cat);

基于以上原理,我们可以做一个RGB图的隐写术:

%融合函数
function [image] = encode(image1,image2)
    image1 = idivide(image1,10)*10;
    [h,w] = size(image1);
    image2 = imresize(image2,[h,w]);
    image2 = image2 * (9 / 255); 
    image = image1 + image2;
end
%分离函数
function [image1,image2] = decode(image)
    image1 = idivide(image,10)*10;
    image2 = image - image1;
    image2 = image2 * (255 / 9);
end
%RGB图片融合
clc;clear;
Monalisa = imread("monalisa.png");
Cat = imread("cat.png");
MonalisaRed = Monalisa(:,:,1);
MonalisaGreen = Monalisa(:,:,2);
MonalisaBlue = Monalisa(:,:,3);
CatRed = Cat(:,:,1);
CatGreen = Cat(:,:,2);
CatBlue = Cat(:,:,3);
redImage = encode(MonalisaRed,CatRed);
greenImage = encode(MonalisaGreen,CatGreen);
blueImage = encode(MonalisaBlue,CatBlue);
image = cat(3,redImage,greenImage,blueImage); %合成三维矩阵
imshow(image);
imwrite(image,"monalisa_cat.png");
%RGB图片分离
clc;clear;
image = imread("monalisa_cat.png");
redImage = image(:,:,1);
greenImage = image(:,:,2);
blueImage = image(:,:,3);
[MonalisaRed,CatRed] = decode(redImage);
[MonalisaGreen,CatGreen] = decode(greenImage);
[MonalisaBlue,CatBlue] = decode(blueImage);
Monalisa = cat(3,MonalisaRed,MonalisaGreen,MonalisaBlue);
Cat = cat(3,CatRed,CatGreen,CatBlue);
subplot(121);
imshow(Monalisa);
subplot(122);
imshow(Cat);

《 M A T L A B   S Y N T A X 》 系 列 博 客 创 作 参 考 资 料 来 源 《MATLAB\ SYNTAX》系列博客创作参考资料来源 MATLAB SYNTAX

  1. 《自动控制原理实验教程》.巨林仓.西安交通大学出版社.
  2. 《MATLAB工程与科学绘图》.周博.薛世峰.清华大学出版社.
  3. 《MATLAB R2018a完全自学一本通》.刘浩.韩晶.电子工业出版社.
  4. 《科学计算与MATLAB语言》.刘卫国.蔡旭晖.吕格莉.何小贤.中国大学MOOC.
  5. 《MATLAB软件与基础数学实验》.李换琴.朱旭.王勇茂.籍万新.西安交通大学出版社.
  6. 《Matlab教程 - 图像处理》@正月点灯笼.https://www.bilibili.com.
  7. 《MATLAB从入门到秃头》@古德谓尔.https://www.bilibili.com.

博 客 创 作 : A i d e n   L e e 博客创作:Aiden\ Lee Aiden Lee
特别声明:文章仅供学习参考,转载请注明出处,严禁盗用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值