一、孔洞填充

基本思想:
基于形态学算法,膨胀后与上取反的原图

算法实现步骤:
1.首先找出所有孔洞的位置,只需知道洞中的一个点的坐标即可,下面直接以改点代替该洞
2.新建一张全零图,用0表示背景,1表示前景,大小与原图相同
(1)取出一个洞的坐标,在新图中该位置表1
(2)对该新图用一个结构元进行膨胀,然后再与原图的反(孔洞的地方应全为1)求与
(3)如果检测到一次操作完的结果与操作前相同,则结束迭代
(4)取出下一个洞的坐标,返回到(2)操作,直到所有洞都补完
3.此时新图中为1的位置即为需要填补的孔洞,将新图与原图相或即得到孔洞填充完成的图像
注:
边缘检测:图-腐蚀后的图

代码实现:

clc;clear;
A=imread('Experiment4_tak1.png');
BW=im2bw(A);
AC=~BW;
mask=[0,1,0;1,1,1;0,1,0]; %膨胀操作的结构元
SE=strel('arbitrary',mask);
[m,n]=size(BW);
T=zeros(m,n);%膨胀操作 某位置只要与结构元有交际,则该位置就为集合
%x0找出了所有的孔洞位置
x0={[29,24],[92,20],[187,17],[48,79],[2,91],[132,72],[92,102],[236,70],[213,117],[53,153],[122,155],[197,189],[262,181],[29,230],[119,233],[204,240],[260,250]};
for i=1:length(x0)
flag=1;
T_last=zeros(m,n);
col_temp=x0{i}(1);
row_temp=x0{i}(2);T(row_temp,col_temp)=1;       %令该位置为1 然后利用模板进行膨胀while flagT=imdilate(T,SE);T=T∾               %将T与背景相与,注意这里T和AC用1表示需要填充的空洞即黑色局域 if T==T_last          %如果操作前后没有变化则认为填充完成flag=0;endT_last=T;end
end
New=BW|T;edge=New-imerode(New,SE);subplot(131);
imshow(BW);title('处理前');
subplot(132);
imshow(New);title('处理后');
subplot(133);
imshow(edge);title('边缘');

结果:

二、全局阈值

2.1 迭代阈值

基本思想:
Ti1=(小于Ti的平均灰度+大于Ti的平均灰度)/2,一直迭代到Ti1与Ti相同

注:
matlab默认操作的数据类型是double,所以转int时一定要慎重,一个表达式中有一个int整个表达式就是int型了!

代码实现:

clc;clear;
A=imread('Experiment4_task2.jpg');
A=rgb2gray(A);H=imhist(A);
h=H./sum(H);
h=h';
T0=120;
error=100;%循环或用矩阵相乘做
%这里注意表达式中存在int整个式子就默认为int型
while (error)>=1e-5temp1=0;sum1=sum(h(1:(T0+1)));temp2=0;sum2=sum(h((T0+2):256));for i=1:double(T0+1)temp1=temp1+h(i)*(i-1)/sum1;end%     x=double(0:T0);
%     temp1=x*h(1:T0+1)'/sum(h(1:T0+1));for j=double(T0+2):256temp2=temp2+h(j)*(j-1)/sum2;end
%     y=double(T0+1:255);
%     temp2=y*h(T0+2:256)'/sum(h(T0+2:256));T1=(1/2*(temp1+temp2));error=abs(T1-T0);T0=int32(T1);
end% while error>1
%     temp1=(find(A>T0));
%     temp2=(find(A<T0));
%     T1=1/2*(mean(A(temp1))+mean(A(temp2)));
%     error=abs(T1-T0);
%     T0=T1;
% end[m,n]=size(A);
A1=A;
for i=1:mfor j=1:nif A1(i,j)>T0A1(i,j)=255;elseA1(i,j)=0;endend
end
str1=['迭代法 阈值为',num2str(T0)];
subplot(121);
imshow(A1);title(str1);

2.2 Otsu方法, 大津法

基本思想:
阈值从0取到255,计算每一阈值对应类间方差,取类间方差取max时的阈值


代码实现:

%otsu方法
for i=1:256P1=sum(h(1:i));P2=1-P1;m1=0;m2=0;for j=1:256if j<=im1=m1+h(j)*(j-1)/P1;elsem2=m2+h(j)*(j-1)/P2;endendop(i)=P1*P2*(m1-m2)^2;
end
t=find(op==max(op))-1;
A2=A;
for i=1:mfor j=1:nif A2(i,j)>tA2(i,j)=255;elseA2(i,j)=0;endend
end
str2=['大津法 阈值为',num2str(t)];
subplot(122);
imshow(A2);title(str2);

结果:

三、自适应阈值

基本思想:
如果图像光照不均匀等因素,则不能使用一个规定的全局阈值,选择的阈值时坐标的函数。

算法实现步骤:
1.将整幅图像分成一系列互相有50%重叠的子图像;
2.得到每个子图像的直方图;
3.检测各子图像是否为双峰,若是则采用最优阈值法,否则不进行处理;
4.根据对直方图为双峰的子图像得到的阈值,通过插值得到所有子图像的插值;
5.根据各子图像的阈值,然后对图像进行分割;
注:
1.这里判断双峰采用了findpeaks()函数,并规定而间距过小的峰值不算,检测到的极大值的个数超过1个则认为是双峰;
2.插值利用的是imresize()函数,直接将得到的一系列阈值模板插值得到与原图等大的阈值矩阵;
3.这里处理的具体方法为:
(1)先不管峰的个数,直接利用大津法直接得到阈值模板后插值得到阈值矩阵T;
(2)对峰的个数进行判断,如果仅有1个的话该处阈值设为0,得到阈值模板后进行插值得到阈值矩阵T1;
(3)最终的阈值模板应为T2=(T1&T).*T

代码实现:

clc;clear;
A=imread('Experiment4_task3.jpg');
A=rgb2gray(A);
[m1,n1]=size(A);
row_num=floor(m1/5);
col_num=floor(n1/5);
for i=0:(row_num-2)for j=0:(col_num-2)block=A(1+5*i:1+5*i+9,1+5*j:1+5*j+9);B=imhist(block);pks=findpeaks(B,'minpeakdistance',35);if length(pks)>1t1=255*graythresh(block);elset1=0;endt=255*graythresh(block);T(i+1,j+1)=t;T1(i+1,j+1)=t1;end
end
T_1=imresize(T,[m1,n1],'bilinear');
T1_1=imresize(T1,[m1,n1],'bilinear');
T2=T_1&T1_1;
T2_1=T2.*T_1;
for i=1:m1for j=1:n1if A(i,j)>T2_1(i,j)A(i,j)=255;elseA(i,j)=0;endend
endfigure;
%进行开操作
mask=[0,1,0;1,1,1;0,1,0]; %膨胀操作的结构元
SE=strel('arbitrary',mask);
A=imerode(A,SE);
A=imdilate(A,SE)
imshow(A);

结果:
效果还行,如果把窗减得更小估计能更好,但就是跑得慢。。。

数字图像处理(作业三)——孔洞填充+全局阈值+自适应阈值相关推荐

  1. 几何畸变图像恢复 openCV3 - 数字图像处理作业3

    几何畸变图像恢复 OpenCV3 - 数字图像处理作业3 作业3:相同条件下拍到的棋盘图和日历钟表图,尝试建立几何畸变关系,并对它们进行恢复.注意:不能采用椭圆的变换. 算法步骤: 坐标变换: 在畸变 ...

  2. 数字图像处理的三个层次

    数字图像处理分为三个层次:低级图像处理.中级图像处理和高级图像处理(狭义图像处理.图像分析和图像理解). 狭义图像处理:对输入图像进行某种变换得到输出图像,是一种图像到图像的过程. (1)低级图像处理 ...

  3. 数字图像处理第三版(冈萨雷斯)——第一章绪论

    数字图像处理第三版(冈萨雷斯)--第一章绪论 一.主要目的 二.关于什么是数字图像处理的几个重要概念 2.1 强度或灰度: 2.2 数字图像: 2.3 数字图像处理: 2.4 像素: 2.5 低级.中 ...

  4. 【计算机视觉】数字图像处理(三)—— 图像变换原理分析

    数字图像处理(三)-- 图像变换原理分析 一.图像变换的目的与用途 1. 图像变换的目的 2. 图像正交变换的要求 正交变换的应用 (一).傅里叶变换 1.傅里叶变换的理论基础与基本定义 2.连续函数 ...

  5. 图像插值和缩放(matlab自实现)--冈萨雷斯《数字图像处理第三版》

    图像插值和缩放(matlab自实现) 1.Explanations of interpolation(插值释义) 1.1 Nearest Neighbor Interpolation(最近邻插值) 1 ...

  6. 数字图像处理——第三章 空间域图像增强(灰度变换和直方图处理)

    文章目录 空间域图像增强 1. 背景知识 2. 基本灰度变换 2.1 图像反转 2.2 对数变换 2.3 幂次变换 2.4 分段线性变换函数 2.4.1 对比拉伸 2.4.2 灰度切割 2.4.3 位 ...

  7. 数字图像处理——第三章 空间域图像增强(空间滤波)

    文章目录 1. 空间滤波基础 2. 线性滤波器 2.1 平滑空间滤波器 2.2 锐化空间滤波器 2.2.1 基于一阶微分的图像增强--梯度法 2.2.2 基于二阶微分的图像增强--拉普拉斯算子 3. ...

  8. 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度 ...

  9. 数字图像处理实验三图像增强

    一.实验目的 (1)了解图像增强的目的及意义,加深对图像增强的 感性认识,巩固所学的图像增强的理论知识和相 关算法. (2)熟练掌握直方图均衡化和直方图规定化的计算过 程. (3)熟练掌握空域滤波中常 ...

最新文章

  1. 德国图宾根大学发布可扩展「对抗黑盒攻击」,仅通过观察决策即可愚弄深度神经网络
  2. 当程序员产崽后...
  3. H5移动端网页标签模板
  4. 怎么样能找到国外的群?
  5. 【Go语言】【13】再谈GO语言的结构体
  6. 互联网高并发架构的8种设计模式演化
  7. 基于jquery响应式网站图片无限加载瀑布流布局
  8. TensorFlow基础篇(二)——tf.get_variable()和tf.get_variable_scope()
  9. mysql图片保存和读取
  10. ubuntu下Xmodmap映射Esc和Ctrl_L
  11. carmaker/matlab联合仿真(一) 新建工程,运行自带example
  12. 工业3D互联网可视化三维数字化智能工厂管理系统
  13. window计算机截屏快捷键,windows截图工具快捷键,win7截屏快捷键是哪个
  14. 去哪儿CEO庄辰超:傍百度战携程与巨头共舞
  15. html5橡皮擦,HTML5 Canvas笔记——实现橡皮擦功能,包括矩形擦和圆形擦。
  16. 伪造微信语音文件的过程分析
  17. C++解决猜大小问题
  18. 错位解读:细节的反义词不是粗心,…
  19. HTML+H5基础——常用标签
  20. SEO优化(搜索引擎优化)

热门文章

  1. Python写入文件的工具类
  2. 多进程IterableDataset流式读取数据的坑:每个进程会读取一遍完整数据
  3. 机器学习Machine learning in action实战相关资料
  4. java 身份证地址提取籍贯_从身份证号码中提取信息,这些方法请收好
  5. node.js(八 --- express)
  6. Golang入门第一天-工具准备
  7. 正则表达式 6. 存在(或)
  8. Linux常用命令汇总及使用方法(二)之文本编辑器VI
  9. Unicode 编码解码
  10. JAVA抽象类和接口的深入探讨