图像细化函数(背景为黑色像素值为0,前景为白色像素值255,必须只含有0和255的像素值,即二值化后的图像)

procedure thinimage(srcimage:pIplImage);
var
count:Integer; //表示迭代次数
Zhangmude:array [1..9] of Integer;
deletelist1,deletelist2:Tlist<Tcvpoint>; //存放着要删除的点
idx,i,j:Integer;
whitepointtotal,ap:Integer;
tempoint:TCvPoint;
begin
deletelist1:=Tlist<Tcvpoint>.Create;
deletelist2:=Tlist<Tcvpoint>.Create;
count:=0;
while(True)do
begin
count:=count+1;
for I := 1 to srcimage.height-2 do //以后可以只考虑最小外接矩形,,,这样节省时间
begin
for j := 1 to srcimage.width - 2 do
begin
if srcimage.imageData[j+round(I*srcimage.widthStep)]>0 then
begin //需要删除的点,首先必须是 白色的点,值为1
Zhangmude[1]:=1;
if srcimage.imageData[j+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[2]:=1 else Zhangmude[2]:=0;
if srcimage.imageData[j+1+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[3]:=1 else Zhangmude[3]:=0;
if srcimage.imageData[j+1+round(I*srcimage.widthStep)]>0 then
Zhangmude[4]:=1 else Zhangmude[4]:=0;
if srcimage.imageData[j+1+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[5]:=1 else Zhangmude[5]:=0;
if srcimage.imageData[j+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[6]:=1 else Zhangmude[6]:=0;
if srcimage.imageData[j-1+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[7]:=1 else Zhangmude[7]:=0;
if srcimage.imageData[j-1+round(I*srcimage.widthStep)]>0 then
Zhangmude[8]:=1 else Zhangmude[8]:=0;
if srcimage.imageData[j-1+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[9]:=1 else Zhangmude[9]:=0;
whitepointtotal:=0;
for idx:=2 to 9 do
begin
whitepointtotal:=Zhangmude[idx]+ whitepointtotal;
end;
if (whitepointtotal>=2) and (whitepointtotal<=6) then
begin
ap:=0;
if ((Zhangmude[2]=0) and (Zhangmude[3]=1)) then ap:=ap+1;
if ((Zhangmude[3]=0) and (Zhangmude[4]=1)) then ap:=ap+1;
if ((Zhangmude[4]=0) and (Zhangmude[5]=1)) then ap:=ap+1;
if ((Zhangmude[5]=0) and (Zhangmude[6]=1)) then ap:=ap+1;
if ((Zhangmude[6]=0) and (Zhangmude[7]=1)) then ap:=ap+1;
if ((Zhangmude[7]=0) and (Zhangmude[8]=1)) then ap:=ap+1;
if ((Zhangmude[8]=0) and (Zhangmude[9]=1)) then ap:=ap+1;
if ((Zhangmude[9]=0) and (Zhangmude[2]=1)) then ap:=ap+1;
if ap=1 then
begin
if (Zhangmude[2]*Zhangmude[8]*Zhangmude[6]=0) and (Zhangmude[4]*Zhangmude[6]*Zhangmude[8]=0) then
begin
tempoint.x:=j;
tempoint.y:=i;
deletelist1.Add(tempoint);
end;
end;
end;
end;
end;
end;

for Idx := 0 to deletelist1.Count - 1 do
begin
tempoint:=deletelist1[Idx];
j:=tempoint.x;
i:=tempoint.y;
srcimage.imageData[j+round(i*srcimage.widthStep)]:=0;
end;
if deletelist1.Count=0 then Break else deletelist1.Clear;

for I := 1 to srcimage.height-2 do //以后可以只考虑最小外接矩形,,,这样节省时间
begin
for j := 1 to srcimage.width - 2 do
begin
if srcimage.imageData[j+round(I*srcimage.widthStep)]>0 then
begin //需要删除的点,首先必须是 白色的点,值为1
Zhangmude[1]:=1;
if srcimage.imageData[j+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[2]:=1 else Zhangmude[2]:=0;
if srcimage.imageData[j+1+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[3]:=1 else Zhangmude[3]:=0;
if srcimage.imageData[j+1+round(I*srcimage.widthStep)]>0 then
Zhangmude[4]:=1 else Zhangmude[4]:=0;
if srcimage.imageData[j+1+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[5]:=1 else Zhangmude[5]:=0;
if srcimage.imageData[j+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[6]:=1 else Zhangmude[6]:=0;
if srcimage.imageData[j-1+round((I+1)*srcimage.widthStep)]>0 then
Zhangmude[7]:=1 else Zhangmude[7]:=0;
if srcimage.imageData[j-1+round(I*srcimage.widthStep)]>0 then
Zhangmude[8]:=1 else Zhangmude[8]:=0;
if srcimage.imageData[j-1+round((I-1)*srcimage.widthStep)]>0 then
Zhangmude[9]:=1 else Zhangmude[9]:=0;
whitepointtotal:=0;
for idx:=2 to 9 do
begin
whitepointtotal:=Zhangmude[idx]+ whitepointtotal;
end;
if (whitepointtotal>=2) and (whitepointtotal<=6) then
begin
ap:=0;
if ((Zhangmude[2]=0) and (Zhangmude[3]=1)) then ap:=ap+1;
if ((Zhangmude[3]=0) and (Zhangmude[4]=1)) then ap:=ap+1;
if ((Zhangmude[4]=0) and (Zhangmude[5]=1)) then ap:=ap+1;
if ((Zhangmude[5]=0) and (Zhangmude[6]=1)) then ap:=ap+1;
if ((Zhangmude[6]=0) and (Zhangmude[7]=1)) then ap:=ap+1;
if ((Zhangmude[7]=0) and (Zhangmude[8]=1)) then ap:=ap+1;
if ((Zhangmude[8]=0) and (Zhangmude[9]=1)) then ap:=ap+1;
if ((Zhangmude[9]=0) and (Zhangmude[2]=1)) then ap:=ap+1;
if ap=1 then
begin
if (Zhangmude[2]*Zhangmude[4]*Zhangmude[6]=0) and (Zhangmude[2]*Zhangmude[4]*Zhangmude[8]=0) then
begin
tempoint.x:=j;
tempoint.y:=i;
deletelist2.Add(tempoint);
end;
end;
end;
end;
end;
end;
for Idx := 0 to deletelist2.Count - 1 do
begin
tempoint:=deletelist2[Idx];
j:=tempoint.x;
i:=tempoint.y;
srcimage.imageData[j+round(i*srcimage.widthStep)]:=0;
end;
if deletelist2.Count= 0 then Break else deletelist2.Clear;
end;
deletelist1.Free;
deletelist2.Free;
end;

时间: 2024-11-06 19:51:44

图像细化函数(背景为黑色像素值为0,前景为白色像素值255,必须只含有0和255的像素值,即二值化后的图像)的相关文章

记录一个优秀的图像二值化代码

#region 二值化02 public Bitmap binaryzation(Bitmap srcBitmap, Bitmap dstBitmap) { int threshold = 0; Byte[,] BinaryArray = ToBinaryArray(srcBitmap, out threshold); dstBitmap = BinaryArrayToBinaryBitmap(BinaryArray); return dstBitmap; } /// <summary> //

c#图像灰度化、灰度反转、二值化

图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图像以使后续的图像的计算量变得少一些.灰度图像的描述与彩色图像一样仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征.图像的灰度

opencv 删除二值化图像中面积较小的连通域

对于上图的二值化图像,要去除左下角和右上角的噪点,方法:使用opencv去掉黑色面积较小的连通域. 代码 CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg.DoModal()==IDOK) { CvMemStorage* storage = cvCreateMemStorage(0); IplImage* img_src= cvLoadImage(

OpenCV图像细化的一个例子

转自:http://blog.csdn.net/zfdxx369/article/details/9091953?utm_source=tuicool 本文是zhang的一篇经典图像细化论文,效果很好,采用并行计算,速度非常快; 下文是 "智慧视觉"在CSDN上对这篇论文程序的一个改造,亲测可用! 由于OpenCV没有自带的图像细化函数,网上提供的基本是基于1.0接口的,于是乎动手搞成2.0 Mat类型接口的,方便好用.细化方法当中,当属经典的Zhang并行快速细化算法,细化之后的轮廓

图像 - 灰度化、灰度反转、二值化

原文地址:http://www.cnblogs.com/gdjlc/archive/2013/03/05/2943801.html 图像灰度化: 将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*255)的颜色的变化范围.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其一个像素点的变化范围为255种,所以在数字图像处理种一般先将各种格式的图像转变成灰度图

函数bsxfun,两个数组间元素逐个计算的二值操作

转自http://www.cnblogs.com/rong86/p/3559616.html 函数功能:两个数组间元素逐个计算的二值操作 使用方法:C=bsxfun(fun,A,B) 两个数组A合B间元素逐个计算的二值操作,fun是函数句柄或者m文件,也可以为如下内置函数: @plus 加@minus 减@times 数组乘<Simulink与信号处理>@rdivide 左除@ldivide 右除@power 数组幂乘@max 二值最大值@min 二值最小值@rem 余数@mod 求模@ata

3直方图与二值化,图像梯度

1直方图 #直方图--增强对比度 def equalHist_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) dst = cv.equalizeHist(gray) cv.imshow("equalHist_demo", dst) def clahe_demo(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) clahe = cv.createCLAHE(clip

opencv二值图反色处理

反色处理指的是:如果原先图像的背景是白色,而目标是黑色的话:经过反色处理后,背景变为白色,目标变为黑色. 在opencv中,对于二值图的反色处理有两种方法: 之前处理好的二值图的定义为:Mat  binaryImg; 1.直接使用opencv中的函数: //! inverts each bit of array (dst = ~src) CV_EXPORTS_W void bitwise_not(InputArray src, OutputArray dst, InputArray mask=n

图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一.RGB RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值.RGB图像仅仅使用三种颜色,R(red).G(green).B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色. 在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示.通常情况下,RGB各有256级亮度,用数字表示为从0.1.2...直到255. 二.ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透