Matlab图像处理1

%% 清理屏幕,包括工作区清除、命令窗口清除、所有图形窗口和文件等关闭
clear;clc;close all;
%% 选择需要处理的图形文件 柯南5号
%uigetfile:界面打开文件
% [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)
[filename,pathname,FilterIndex]=uigetfile(…
{’.’, ‘所有文件(.)-可自定义’;…
.bmp’,'all image file (.bmp)-可自定义’;…
.jpg’,'all image file (.jpg)-可自定义’},…
‘请选择要处理的图片-可自定义’,…
‘MultiSelect’, ‘on’);
% [filename,pathname,FilterIndex]=uigetfile(…
% {’.’, ‘所有文件(.)’;…
% ‘.bmp’,'all image file (.bmp)’;…
% ‘.jpg’,'all image file (.jpg)’},…
% ‘请选择要识别的图片’);
% [FileName,PathName,FilterIndex] = uigetfile(FilterSpec,DialogTitle,DefaultName)
% FileName:返回的文件名
% PathName:返回的文件的路径名
% FilterIndex:选择的文件类型
% FilterIndex
% 可返回选择的文件类型序号,
% ‘MultiSelect’, ‘on’
% 并且可以设置文件多选,设置文件多选时注意,当只选了一个文件时,
% 返回的filename为字符串,选择多个文件时,返回的元胞类型。
%% imread读取对应选择的文件,并保存到input_image,利用imshow显示原始图像
input_image=imread([pathname filename]); %RGB类型是uint8
input_image=im2double(input_image);%转换成统一的double精度,方便计算
figure;imshow(input_image);title(‘原始图像’);%显示原始图像
%% 图像数据准备完成…
% 华丽的分割线------------------------------------------------------------
% 图像处理
%% 二值化im2bw:Convert image to binary image, based on threshold
figure
BW_RGB=im2bw(input_image,0.65);%
subplot(141);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果

BW_R=im2bw(input_image(:,:,1),0.65);%显示R二值化结果
subplot(142);imshow(BW_R);title(‘二值化-R’);%显示R二值化结果

BW_G=im2bw(input_image(:,:,2),0.65);%显示G二值化结果
subplot(143);imshow(BW_G);title(‘二值化-G’);%显示G二值化结果

BW_B=im2bw(input_image(:,:,3),0.65);%显示G二值化结果
subplot(144);imshow(BW_B);title(‘二值化-B’);%显示B二值化结果

% BW_RGB=BW_B;%用于id.png

%% 二值化详细展示
% 1)背景颜色设定
% P_image=zeros(size(input_image,1),size(input_image,2),3);%背景颜色:黑[0 0 0]
% P_image=0.5ones(size(input_image,1),size(input_image,2),3);%背景颜色:灰[0.5 0.5 0.5]
% P_image=0.5
ones(size(input_image,1),size(input_image,2),3);%背景颜色:白[1 1 1]
% 变任意颜色
P_image(:,:,1)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,2)=ones(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,3)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
% 变任意颜色
figure;subplot(221);imshow(P_image);title(‘背景图像’);%显示背景颜色

% 2)二值化索引计算
BW_RGB=im2bw(input_image,0.65);%显示RGB二值化结果

% 3)根据二值化索引数值1,将原始图像中对应像素块替换背景像素块
[a,b]=find(BW_RGB==1);
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
P_image(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
P_image(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
P_image(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

% 4)展示背景、原始图像和二值化索引矩阵共同构造的抠图图像效果
subplot(222);imshow(input_image);title(‘原始图像’);%显示RGB二值化结果
subplot(223);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果
subplot(224);imshow(P_image);title(‘二值化后抠图’);%显示抠图结果

%% 膨胀算法:
% 是将与物体接触的所有背景点合并到该物体中,
% 使边界向外部扩张的过程。可以用来填补物体中的空洞。

% 1)背景颜色设定
P_image(:,:,1)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,2)=ones(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,3)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]

% 2)二值化索引计算
BW_RGB=im2bw(input_image,0.65);%显示RGB二值化结果
BW_RGB_inverse=~BW_RGB;%显示RGB二值化结果
% imshow(BW_RGB)
% figure;imshow(BW_RGB_inverse)
% 二值化进阶-膨胀效果:imdilate
% (1)二值化-膨胀
pz_N=5;% 膨胀数值:(参考值:3~10)
se=strel(‘disk’,pz_N)%算子
BW_dilate=imdilate(BW_RGB,se);%imerode:二值化图像+算子
% imshow(BW_dilate)
% (2)二值化-取反-膨胀
se=strel(‘disk’,pz_N)%算子
BW_dilate_inverse=imdilate(BW_RGB_inverse,se);%imerode:二值化图像+算子

% 3)根据二值化索引数值1,将原始图像中对应像素块替换背景像素块
%(1)二值化-膨胀-抠图
[a,b]=find(BW_dilate==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

%(2)二值化-取反-膨胀-抠图
[a,b]=find(BW_dilate_inverse==1);
A_2=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_2(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_2(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_2(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

% 4)展示背景、原始图像和二值化索引矩阵共同构造的抠图图像效果
figure;
subplot(241);imshow(P_image);title(‘背景图像’);%显示背景颜色
subplot(242);imshow(input_image);title(‘原始图像’);%显示RGB二值化结果
subplot(243);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果
subplot(244);imshow(BW_RGB_inverse);title(‘二值化-RGB-取反’);%显示RGB二值化结果
subplot(245);imshow(BW_dilate);title(‘二值化-膨胀’);%显示RGB二值化结果
subplot(246);imshow(BW_dilate_inverse);title(‘二值化-取反-膨胀’);%显示RGB二值化结果
subplot(247);imshow(A_1);title(‘二值化-膨胀后抠图’);%显示抠图结果
subplot(248);imshow(A_2);title(‘二值化-取反-膨胀后抠图’);%显示抠图结果
axis image

%% 腐蚀算法:
% 是一种消除边界点,使边界向内部收缩的过程。
% 可以用来消除小且无意义的物体。

% 1)背景颜色设定
P_image(:,:,1)=zeros(size(input_image,1),size(input_image,2));%背景颜色[0.5 0.5 0.5]
P_image(:,:,2)=ones(size(input_image,1),size(input_image,2));%背景颜色[0.5 0.5 0.5]
P_image(:,:,3)=zeros(size(input_image,1),size(input_image,2));%背景颜色[0.5 0.5 0.5]

% 2)二值化索引计算
BW_RGB=im2bw(input_image(:,:,1),0.65);%显示RGB二值化结果
BW_RGB_inverse=~BW_RGB;%显示RGB二值化结果

% 二值化进阶-腐蚀效果:imerode
% (1)二值化-腐蚀
fs_N=8;% 腐蚀数值:(参考值:3~10)
se=strel(‘square’,fs_N)%%算子
BW_erode=imerode(BW_RGB,se);

% (2)二值化-取反-腐蚀
se=strel(‘square’,fs_N)%算子
BW_erode_inverse=imerode(BW_RGB_inverse,se);%imerode:二值化图像+算子

% 3)根据二值化索引数值1,将原始图像中对应像素块替换背景像素块
%(1)二值化-腐蚀-抠图
[a,b]=find(BW_erode==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

%(2)二值化-取反-膨胀-抠图
[a,b]=find(BW_erode_inverse==1);
A_2=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_2(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_2(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_2(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

% 4)展示背景、原始图像和二值化索引矩阵共同构造的抠图图像效果
figure;
subplot(241);imshow(P_image);title(‘背景图像’);%显示背景颜色
subplot(242);imshow(input_image);title(‘原始图像’);%显示RGB二值化结果
subplot(243);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果
subplot(244);imshow(BW_RGB_inverse);title(‘二值化-RGB-取反’);%显示RGB二值化结果
subplot(245);imshow(BW_erode);title(‘二值化-腐蚀’);%显示RGB二值化结果
subplot(246);imshow(BW_erode_inverse);title(‘二值化-取反-腐蚀’);%显示RGB二值化结果
subplot(247);imshow(A_1);title(‘二值化-腐蚀后抠图’);%显示抠图结果
subplot(248);imshow(A_2);title(‘二值化-取反-腐蚀后抠图’);%显示抠图结果
axis image

%% 开运算:
% 先腐蚀后膨胀的过程开运算。
% 用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的
% 同时并不明显改变其面积。开运算通常是在需要去除小颗粒噪声,
% 以及断开目标物之间粘连时使用。其主要作用与腐蚀相似,
% 与腐蚀操作相比,具有可以基本保持目标原有大小不变的优点。

% 1)背景颜色设定
P_image(:,:,1)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,2)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,3)=ones(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]

% 2)二值化索引计算
BW_RGB=im2bw(input_image(:,:,1),0.65);%显示RGB二值化结果
BW_RGB_inverse=~BW_RGB;%显示RGB二值化结果

% 二值化进阶-开运算:腐蚀:imerode 膨胀:imdilate
fs_N=5;% 腐蚀数值:(参考值:3~10)
pz_N=10;% 膨胀数值:(参考值:3~10)
% (1)二值化-腐蚀-膨胀
se=strel(‘square’,fs_N)%算子
BW_erode=imerode(BW_RGB,se);
se=strel(‘disk’,pz_N)%算子
BW_dilate=imdilate(BW_erode,se);%imerode:二值化图像+算子

% (2)二值化-取反-腐蚀-膨胀
se=strel(‘square’,fs_N)%算子
BW_erode_inverse=imerode(BW_RGB_inverse,se);%imerode:二值化图像+算子
se=strel(‘disk’,pz_N)%算子
BW_dilate_inverse=imdilate(BW_erode_inverse,se);%imerode:二值化图像+算子

% 3)根据二值化索引数值1,将原始图像中对应像素块替换背景像素块
%(1)二值化-腐蚀-抠图
[a,b]=find(BW_dilate==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

%(2)二值化-取反-膨胀-抠图
[a,b]=find(BW_dilate_inverse==1);
A_2=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_2(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_2(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_2(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

% 4)展示背景、原始图像和二值化索引矩阵共同构造的抠图图像效果
figure;
subplot(241);imshow(P_image);title(‘背景图像’);%显示背景颜色
subplot(242);imshow(input_image);title(‘原始图像’);%显示RGB二值化结果
subplot(243);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果
subplot(244);imshow(BW_RGB_inverse);title(‘二值化-RGB-取反’);%显示RGB二值化结果
subplot(245);imshow(BW_dilate);title(‘二值化-腐蚀-膨胀’);%显示RGB二值化结果
subplot(246);imshow(BW_dilate_inverse);title(‘二值化-取反-腐蚀-膨胀’);%显示RGB二值化结果
subplot(247);imshow(A_1);title(‘二值化-腐蚀-膨胀后抠图’);%显示抠图结果
subplot(248);imshow(A_2);title(‘二值化-取反-腐蚀-膨胀后抠图’);%显示抠图结果
axis image

%% 闭运算:
% 先膨胀后腐蚀的过程称为闭运算。
% 用来填充物体内细小空洞、连接邻近物体、平滑 其边界的同时并不明显改变其面积。

% 1)背景颜色设定
P_image(:,:,1)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,2)=ones(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]
P_image(:,:,3)=zeros(size(input_image,1),size(input_image,2),1);%背景颜色[0.5 0.5 0.5]

% 2)二值化索引计算
BW_RGB=im2bw(input_image(:,:,1),0.65);%显示RGB二值化结果
BW_RGB_inverse=~BW_RGB;%显示RGB二值化结果

% 二值化进阶-开运算:腐蚀:imerode 膨胀:imdilate
pz_N=5;% 膨胀数值:(参考值:3~10)
fs_N=5;% 腐蚀数值:(参考值:3~10)
% (1)二值化-膨胀-腐蚀
se=strel(‘disk’,pz_N)%算子
BW_dilate=imdilate(BW_RGB,se);%imerode:二值化图像+算子
se=strel(‘square’,fs_N)%算子
BW_erode=imerode(BW_dilate,se);

% (2)二值化-取反-膨胀-腐蚀
se=strel(‘disk’,pz_N)%算子
BW_dilate_inverse=imdilate(BW_RGB_inverse,se);%
se=strel(‘square’,fs_N)%算子
BW_erode_inverse=imerode(BW_dilate_inverse,se);%

% 3)根据二值化索引数值1,将原始图像中对应像素块替换背景像素块
%(1)二值化-膨胀-腐蚀-抠图
[a,b]=find(BW_erode==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

%(2)二值化-取反-膨胀-腐蚀-抠图
[a,b]=find(BW_erode_inverse==1);
A_2=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_2(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_2(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_2(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end

% 4)展示背景、原始图像和二值化索引矩阵共同构造的抠图图像效果
figure;
subplot(241);imshow(P_image);title(‘背景图像’);%显示背景颜色
subplot(242);imshow(input_image);title(‘原始图像’);%显示RGB二值化结果
subplot(243);imshow(BW_RGB);title(‘二值化-RGB’);%显示RGB二值化结果
subplot(244);imshow(BW_RGB_inverse);title(‘二值化-RGB-取反’);%显示RGB二值化结果
subplot(245);imshow(BW_erode);title(‘二值化-膨胀-腐蚀’);%显示RGB二值化结果
subplot(246);imshow(BW_erode_inverse);title(‘二值化-取反-膨胀-腐蚀’);%显示RGB二值化结果
subplot(247);imshow(A_1);title(‘二值化-膨胀-腐蚀后抠图’);%显示抠图结果
subplot(248);imshow(A_2);title(‘二值化-取反-膨胀-腐蚀后抠图’);%显示抠图结果
axis image

%% 空洞填充函数:imfill(填洞)
figure
BW_P=BW_erode_inverse;
BW_fill_1=imfill(BW_P,‘holes’);
subplot(241);imshow(BW_fill_1);title(‘空洞填充_1’);%显示抠图结果
se=strel(‘disk’,15)%膨胀算子
BW_dilate=imdilate(BW_erode_inverse,se);%膨胀
subplot(242);imshow(BW_dilate);title(‘膨胀’);%显示抠图结果
BW_fill_2=imfill(BW_dilate,‘holes’);
subplot(243);imshow(BW_fill_2);title(‘空洞填充_2’);%显示抠图结果
se=strel(‘square’,15)%腐蚀算子
BW_erode_inverse=imerode(BW_fill_2,se);%腐蚀
subplot(244);imshow(BW_fill_2);title(‘腐蚀’);%显示抠图结果

%抠图1
[a,b]=find(BW_fill_1==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end
subplot(245);imshow(A_1);title(‘空洞填充_1抠图’);%显示抠图结果

%抠图2
[a,b]=find(BW_dilate==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end
subplot(246);imshow(A_1);title(‘膨胀抠图’);%显示抠图结果

%抠图3
[a,b]=find(BW_fill_2==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end
subplot(247);imshow(A_1);title(‘空洞填充_2抠图’);%显示抠图结果

%抠图4
[a,b]=find(BW_erode_inverse==1);
A_1=P_image;
%搬运二值化数值1标记像素块填补到背景P_image图片中,背景颜色由上面定义
for i=1:size(a,1)
A_1(a(i),b(i),1)=input_image(a(i),b(i),1);%第一通道赋值
A_1(a(i),b(i),2)=input_image(a(i),b(i),2);%第二通道赋值
A_1(a(i),b(i),3)=input_image(a(i),b(i),3);%第三通道赋值
end
subplot(248);imshow(A_1);title(‘腐蚀抠图’);%显示抠图结果

%% 如何保存图
saveas(gcf, ‘example’, ‘jpg’)

%% 扩展函数
% MATLAB实现直方图均衡化处理的函数是:J=histeq(I,n)%保持图像均衡
% I为输入的原图像,J为直方图均衡化后得到的图像,n为均衡化后的灰度级数,默认值为64
% 直方图均衡化处理的步骤如下:
% 1. 求出给定待处理图像的直方图
% 2. 利用累计分布函数对原图像的统计直方图做变换,得到新的图像灰度。
% 3. 进行近似处理,将新灰度代替旧灰度,同时将灰度值相等或相近的每个灰度直方图合并在一起

% mask=adapthisteq(I);%提高图片对比度
% 自适应直方图均衡化(Adaptive histgram equalization/AHE)
% 自适应直方图均衡化(AHE)用来提升图像的对比度的一种计算机图像处理技术。
% 和普通的直方图均衡算法不同,AHE算法通过计算图像的局部直方图,
% 然后重新分布亮度来来改变图像对比度。因此,该算法更适合于改进图像的局部对比度
% 以及获得更多的图像细节。

% obr=imreconstruct(marker,mask);%marker是标记,mask是面具
% 教程:https://ww2.mathworks.cn/help/images/ref/imreconstruct.html
% 例子:
% 进行定位(43,186)对应W
mask=imread(‘text.png’);
mask=im2bw(mask,0.65);%
figure
imshow(mask)
hold on
spy(mask(:,:,1))
% 进行提取
marker = false(size(mask));
marker(39,6:189) = true;
im = imreconstruct(marker,mask);%标记是逻辑值,和mask具有同样大小规模的矩阵才可以
figure
imshow(im)

转自up :Matlab应用的学习视频
https://www.bilibili.com/video/BV14E411V7z2?p=2&spm_id_from=pageDriver

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值