边缘提取,大津算法

  1. 试编程实现提取图像Fig1006(a)(building).tif中的边缘.

解:采用Canny边缘检测器,代码如下:

function Canny()%自己写的Canny算法,陈焜

clc;

clear all;

close all;

img=imread(‘Fig1006(a)(building).tif‘);

figure(1);subplot(221);imshow(img);title(‘原图像‘);

figure(11);imshow(img);title(‘原图像‘);

img=double(img);

[m,n]=size(img);

%%高斯低通滤波,起平滑作用

img1=GLPF(img);%自己写的高斯低通滤波器程序

figure(1);subplot(222);imshow(uint8(img1));title(‘高斯滤波‘);

figure(12);imshow(uint8(img1));title(‘高斯滤波后的图像‘);

%%计算梯度幅值

Sobelx=[-1,-2,-1;0,0,0;1,2,1];%x方向的Sobel模板

Sobely=[-1,0,1;-2,0,2;-1,0,1];%y方向的Sobel模板

gx=imfilter(img1,Sobelx,‘replicate‘); %求x方向梯度分量,replicate表示图像大小通过复制外边界来扩展

gy=imfilter(img1,Sobely,‘replicate‘); %求y方向梯度分量

Mg=sqrt(gx.^2+gy.^2); %梯度幅值

Ag=atan(gy./gx);     %梯度方向

%%非最大抑制

img2=ImaxInhibit(Mg,Ag);

figure(15);imshow(uint8(img2));title(‘非最大抑制‘);

figure(1);subplot(223);imshow(uint8(img2));title(‘非最大抑制‘);

%%双阈值(滞后阈值)处理

img3=DualThreshold(img2);

figure(20);imshow(img3);title(‘Canny处理图像‘);

figure(1);subplot(224);imshow(img3);title(‘Canny处理图像‘);

end

%----------------------------------------------------------------------

%以下为子函数

%高斯低通滤波子函数

function gauss=GLPF(I)

[M, N]=size(I);

P=2*M;%填充图像为P*Q

Q=2*N;

F0=zeros(P,Q);

F0(1:M,1:N)=I; %填充图像

F1= fftshift(F0);%将频域原点移到图像中心;

F= fft2(F1); % 傅立叶变换

D0 = 400; % D0为截止频率

for u=1:P

for v=1:Q

D(u,v)= sqrt((u-P/2)^2+(v-Q/2)^2); %距离

H(u,v)= 1-exp(-D(u,v)^2/(2*D0^2));  % Gauss滤波器函数

%        G(u,v) = H(u,v).*F(u,v);

end

end

G = H.*F;%放在循环外,减少计算量

g = ifft2(G);% 傅立叶反变换

g1= real(g); %取实部

g2= ifftshift(g1);%将频域原点移到图像中心;

gauss=g2(1:M,1:N);%裁截图像

end

%%非最大抑制子函数

function Img=ImaxInhibit(Mg,Ag)

[M,N]=size(Mg);

Ag=Ag*180;

Img=Mg;

for i=2:M-1

for j=2:N-1

if Ag(i,j)>=-22.5&&Ag(i,j)<22.5||abs(Ag(i,j))>=157.5 %水平边缘

if Mg(i,j)<Mg(i+1,j)||Mg(i,j)<Mg(i-1,j)

Img(i,j)=0; %抑制

end

Else

If

Ag(i,j)>=-67.5&&Ag(i,j)<-22.5||Ag(i,j)>=112.5&&Ag(i,j)<157.5%+45°

if Mg(i,j)<Mg(i+1,j-1)||Mg(i,j)<Mg(i-1,j+1)

Img(i,j)=0; %抑制

end

else

if

Ag(i,j)>=-112.5&&Ag(i,j)<-67.5||Ag(i,j)>=67.5&&Ag(i,j)<112.5%垂直

if Mg(i,j)<Mg(i,j-1)||Mg(i,j)<Mg(i,j+1)

Img(i,j)=0; %抑制

end

else

if

Ag(i,j)>-157.5&&Ag(i,j)<-112.5||Ag(i,j)>=22.5&&Ag(i,j)<67.5 %—45°

if Mg(i,j)<Mg(i-1,j-1)||Mg(i,j)<Mg(i+1,j+1)

Img(i,j)=0; %抑制

end

end

end

end

end

end

end

end

%%双阈值(滞后阈值)处理子函数

function G=DualThreshold(Gn)

[M,N]=size(Gn);

Gn=mat2gray(Gn);%归一化

Gnh=Gn;

Gnl=Gn;

Th=0.12;

Tl=0.04;%满足高阈值与低阈值之比为3:1或者2:1

for i=2:M-1

for j=2:N-1

if Gn(i,j)<Th

Gnh(i,j)=0;%高阈值抑制

end

if Gn(i,j)<Tl

Gnl(i,j)=0;%低阈值抑制

end

end

end

Gnl1=Gnl-Gnh;%从Gnl中删除所有来自Gnh的非零像素,参见教材P465 式(10.2-35)

B=[0,1,0;1,1,1;0,1,0];%用膨胀的方法进行连接

Gnl1=imdilate(Gnl1,B);

G=Gnh+Gnl1;%将Gnl1中的所有非零像素附加到Gnh中

G=Gnh;

figure(18);imshow(Gnl);title(‘Gnl‘);

figure(19);imshow(Gnh);title(‘Gnh‘);

figure(17);imshow(Gnl1);title(‘Gnl-Gnh‘);

end

运行结果如下:

  1. 试编程实现图像最优全局阈值分割方法(即global optimal segmentation,大津算法),并将其应用于分割出图像Fig1013(a)(scanned-text-grayscale).tif中的文字,并求出最优全局阈值(global optimal threshold).

解:大津算法,代码如下:

function Otsu()%自己写的大津算法,ck

clc;

clear all;

close all;

Img=imread(‘Fig1013(a)(scanned-text-grayscale).tif‘); %读入图片

Img=rgb2gray(Img);%因为原图是3维的,故需要转换

figure(1),imshow(Img);title(‘原图像‘)

p=zeros(1,256);%存放各灰度级的比率

Img=double(Img);%双精度化

[M,N]=size(Img);

%计算图像直方图

for k=0:255

p(k+1)=length(find(Img==k))/(M*N); %计算每级灰度出现的概率(数组下标从1开始)

end

k=1:1:256;

figure(2); bar(k,p); title(‘原图像直方图‘);

for i=2:256

if p(i)~=0

minT=i+1;%寻找比率不为0的最小灰度值

break

end

end

for i=256:-1:1

if p(i)~=0;

maxT=i-1;%找出比率不为0的最大灰度值

break

end

end

Mg=0;%Mg为全局均值

for i=1:255

Mg=Mg+i*p(i);

end

Var=zeros(1,(maxT-minT));%类间方差

Var1=0;%最大类间方差

for k=minT:maxT

P1=0;%被分到C1的概率

m=0;%被分到C1的像素的平均灰度值

for i=1:k

P1=P1+p(i);%求被分到C1的概率, 参照教材P481 式(10.3-4)

m=m+i*p(i);%求被分到C1的像素的平均灰度值, 参照教材P481 式(10.3-8)

end

Var(k)=(Mg*P1-m)^2/(P1*(1-P1));%求类间方差, 参照教材P481 式(10.3-15)

if(Var(k)>=Var1)

Var1=Var(k);%取得最大类间方差

end

end

%如果有多个k使类间方差取得最大值,则取多个k的平均值作为最佳阈值,参照教材P481

K=zeros(1,(maxT-minT));%最佳阈值

j=0;%统计取得最大类间方差的阈值个数

for k=minT:maxT

if(Var(k)==Var1)

j=j+1;

K(j)=k;%取得最大类间方差的阈

end

end

K1=sum(K)/j %取多个k的平均值作为最佳阈值

%用Ostu方法的最佳阈值处理

for i=1:M

for j=1:N

if (Img(i,j)>K1)

Img1(i,j)=255;

else

Img1(i,j)=0;

end

end

End

figure(3);imhist(Img1);title(‘Otsu直方图‘);

figure(4);imshow(Img1);title(‘Otsu最佳阈值处理图像‘);

text(‘Position‘,[400,480],‘String‘,‘Otsu最佳阈值:‘,‘color‘,‘r‘)%标注最佳阈值

text(‘Position‘,[510,480],‘String‘,num2str(K1),‘color‘,‘r‘)

运行结果如下:

最优全局阈值:102

时间: 2024-11-10 13:00:18

边缘提取,大津算法的相关文章

大津法---OTSU算法

简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大(何为类间方差?原理中有介绍). OTSU算法 OTSU算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用.它是按图像的灰度特性,将图像分成背景和前景两

大津法

转自http://blog.163.com/yuyang_tech/blog/static/216050083201302113341762/ 大津法理解 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大(何为类间方差?原理中有介绍). 原理: 对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比

大津法理解

简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图像二值化分割后,前景与背景图像的类间方差最大(何为类间方差?原理中有介绍). 原理: 对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0:背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1.图像的总平均灰度记为μ,类间方差记为g. 假设图像的背景较暗,并且

大津法阈值分割+直方图

声明: 如题吧,不想解释太多,凡是学过图像处理的,应该都知道原理,不知道的在后面的参考文献中,也可以找出. 我只是来贴代码的. 代码: 1 #include <iostream> 2 #include <stdio.h> 3 #include <math.h> 4 5 using namespace std; 6 7 int Histogram(unsigned short* a, int* hist,int h,int w) 8 { 9 if (a == NULL |

大津法(Python实现)

在计算机视觉和图像处理中,大津法被用于自动获取图像的阈值,或者将灰度图像转换为二值化图像.该算法假设图像包含两个类别的像素(前景像素和背景像素),然后它计算一个最优的阈值用于分离前景和背景,使得前景和背景的类间方差最小. 下面定义类间方差的计算公式: 假设我们使用阈值T将灰度图像分割为前景和背景 size:图像总像素个数 u:图像的平均灰度 w0:前景像素点占整幅图像大小的比例 u0:前景像素点的平均值 w1:背景像素点占整幅图像大小的比例 u0:背景像素点的平均值 g:类间方差 u = w0

数据挖掘十大经典算法

一. C4.5  C4.5算法是机器学习算法中的一种分类决策树算法,其核心算法是ID3 算法.   C4.5算法继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进: 1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足: 2) 在树构造过程中进行剪枝: 3) 能够完成对连续属性的离散化处理: 4) 能够对不完整数据进行处理. C4.5算法有如下优点:产生的分类规则易于理解,准确率较高.其缺点是:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导

数据挖掘领域十大经典算法初探

译者:July   二零一一年一月十五日 ----------------------------------------- 参考文献:国际权威的学术组织ICDM,于06年12月年评选出的数据挖掘领域的十大经典算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART.==============博主说明:1.原文献非最新文章,只是本人向来对算法比较敏感.感兴趣,便把原文细看了下,翻译过程中

九大排序算法总结

九大排序算法再总结 算法的由来:9世纪波斯数学家提出的:“al-Khowarizmi” 排序的定义: 输入:n个数:a1,a2,a3,...,an 输出:n个数的排列:a1',a2',a3',...,an',使得a1'<=a2'<=a3'<=...<=an'. In-place sort(不占用额外内存或占用常数的内存):插入排序.选择排序.冒泡排序.堆排序.快速排序. Out-place sort:归并排序.计数排序.基数排序.桶排序. 当需要对大量数据进行排序时,In-plac

九大排序算法再总结

本文是 http://blog.csdn.net/xiazdong/article/details/7304239 的补充,当年看了<大话数据结构>总结的,但是现在看了<算法导论>,发现以前对排序的理解还不深入,所以打算对各个排序的思想再整理一遍. 本文首先介绍了基于比较模型的排序算法,即最坏复杂度都在Ω(nlgn)的排序算法,接着介绍了一些线性时间排序算法,这些排序算法虽然都在线性时间,但是都是在对输入数组有一定的约束的前提下才行. 这篇文章参看了<算法导论>第2.3