【opencv】图像细化
生活随笔
收集整理的這篇文章主要介紹了
【opencv】图像细化
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【opencv】圖像細(xì)化
?
【opencv】圖像細(xì)化
2014-02-17 21:03?5404人閱讀?評(píng)論(14)?收藏?舉報(bào) ?分類: ? opencv(1)?版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。
???? 在我們進(jìn)行圖像處理的時(shí)候,有可能需要對(duì)圖像進(jìn)行細(xì)化,提取出圖像的骨架信息,進(jìn)行更加有效的分析。
???? 圖像細(xì)化(Image Thinning),一般指二值圖像的骨架化(Image Skeletonization) 的一種操作運(yùn)算。
???? 所謂的細(xì)化就是經(jīng)過(guò)一層層的剝離,從原來(lái)的圖中去掉一些點(diǎn),但仍要保持原來(lái)的形狀,直到得到圖像的骨架。骨架,可以理解為圖象的中軸。
???? 好的細(xì)化算法一定要滿足:- 收斂性;
- 保證細(xì)化后細(xì)線的連通性;
- 保持原圖的基本形狀;
- 減少筆畫相交處的畸變;
- 細(xì)化結(jié)果是原圖像的中心線;
- 細(xì)化的快速性和迭代次數(shù)少;
????這里,我們對(duì)“Zhang并行快速細(xì)化算法”進(jìn)行了實(shí)現(xiàn)(注意,該算法為并行算法,而我們?cè)趯?shí)現(xiàn)過(guò)程中并沒(méi)有并行化處理,所以,效率并沒(méi)有達(dá)到最好)。
????參考資料
- 細(xì)化算法
- 論文 A fast parallel algorithm for thinning digital patterns [cpp]?view plain?copy ?
- #include?<opencv2/opencv.hpp>??
- #include?<iostream>??
- #include?<vector>??
- #include?<limits>??
- ??
- using?namespace?cv;??
- using?namespace?std;??
- ??
- /**?
- ?*?@brief?對(duì)輸入圖像進(jìn)行細(xì)化?
- ?*?@param[in]?src為輸入圖像,用cvThreshold函數(shù)處理過(guò)的8位灰度圖像格式,元素中只有0與1,1代表有元素,0代表為空白?
- ?*?@param[out]?dst為對(duì)src細(xì)化后的輸出圖像,格式與src格式相同,調(diào)用前需要分配空間,元素中只有0與1,1代表有元素,0代表為空白?
- ?*?@param[in]?maxIterations限制迭代次數(shù),如果不進(jìn)行限制,默認(rèn)為-1,代表不限制迭代次數(shù),直到獲得最終結(jié)果?
- ?*/??
- void?thinImage(IplImage*?src,IplImage*?dst,int?maxIterations?=?-1?)??
- {??
- ????CvSize?size?=?cvGetSize(src);??
- ????cvCopy(src,dst);//將src中的內(nèi)容拷貝到dst中??
- ????int?count?=?0;??//記錄迭代次數(shù)??
- ????while?(true)??
- ????{??
- ????????count++;??
- ????????if(maxIterations!=-1?&&?count?>?maxIterations)?//限制次數(shù)并且迭代次數(shù)到達(dá)??
- ????????????break;??
- ????????//std::cout?<<?count?<<?'?';輸出迭代次數(shù)??
- ????????vector<pair<int,int>?>?mFlag;?//用于標(biāo)記需要?jiǎng)h除的點(diǎn)??
- ????????//對(duì)點(diǎn)標(biāo)記??
- ????????for?(int?i=0;?i<size.height;?++i)??
- ????????{??
- ????????????for?(int?j=0;?j<size.width;?++j)??
- ????????????{??
- ????????????????//如果滿足四個(gè)條件,進(jìn)行標(biāo)記??
- ????????????????//??p9?p2?p3??
- ????????????????//??p8?p1?p4??
- ????????????????//??p7?p6?p5??
- ????????????????int?p1?=?CV_IMAGE_ELEM(dst,uchar,i,j);??
- ????????????????int?p2?=?(i==0)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j);??
- ????????????????int?p3?=?(i==0?||?j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j+1);??
- ????????????????int?p4?=?(j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i,j+1);??
- ????????????????int?p5?=?(i==size.height-1?||?j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j+1);??
- ????????????????int?p6?=?(i==size.height-1)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j);??
- ????????????????int?p7?=?(i==size.height-1?||?j==0)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j-1);??
- ????????????????int?p8?=?(j==0)?0:CV_IMAGE_ELEM(dst,uchar,i,j-1);??
- ????????????????int?p9?=?(i==0?||?j==0)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j-1);??
- ??
- ????????????????if?((p2+p3+p4+p5+p6+p7+p8+p9)>=2?&&?(p2+p3+p4+p5+p6+p7+p8+p9)<=6)??
- ????????????????{??
- ????????????????????int?ap=0;??
- ????????????????????if?(p2==0?&&?p3==1)?++ap;??
- ????????????????????if?(p3==0?&&?p4==1)?++ap;??
- ????????????????????if?(p4==0?&&?p5==1)?++ap;??
- ????????????????????if?(p5==0?&&?p6==1)?++ap;??
- ????????????????????if?(p6==0?&&?p7==1)?++ap;??
- ????????????????????if?(p7==0?&&?p8==1)?++ap;??
- ????????????????????if?(p8==0?&&?p9==1)?++ap;??
- ????????????????????if?(p9==0?&&?p2==1)?++ap;??
- ??????????????????????
- ????????????????????if?(ap==1)??
- ????????????????????{??
- ????????????????????????if?(p2*p4*p6==0)??
- ????????????????????????{??
- ????????????????????????????if?(p4*p6*p8==0)??
- ????????????????????????????{??
- ????????????????????????????????//標(biāo)記??
- ????????????????????????????????mFlag.push_back(make_pair(i,j));??
- ????????????????????????????}??
- ????????????????????????}??
- ????????????????????}??
- ????????????????}??
- ????????????}??
- ????????}??
- ??
- ????????//將標(biāo)記的點(diǎn)刪除??
- ????????for?(vector<pair<int,int>?>::iterator?i=mFlag.begin();?i!=mFlag.end();?++i)??
- ????????{??
- ????????????CV_IMAGE_ELEM(dst,uchar,i->first,i->second)?=?0;??
- ????????}??
- ??
- ????????//直到?jīng)]有點(diǎn)滿足,算法結(jié)束??
- ????????if?(mFlag.size()==0)??
- ????????{??
- ????????????break;??
- ????????}??
- ????????else??
- ????????{??
- ????????????mFlag.clear();//將mFlag清空??
- ????????}??
- ??
- ????????//對(duì)點(diǎn)標(biāo)記??
- ????????for?(int?i=0;?i<size.height;?++i)??
- ????????{??
- ????????????for?(int?j=0;?j<size.width;?++j)??
- ????????????{??
- ????????????????//如果滿足四個(gè)條件,進(jìn)行標(biāo)記??
- ????????????????//??p9?p2?p3??
- ????????????????//??p8?p1?p4??
- ????????????????//??p7?p6?p5??
- ????????????????int?p1?=?CV_IMAGE_ELEM(dst,uchar,i,j);??
- ????????????????if(p1!=1)?continue;??
- ????????????????int?p2?=?(i==0)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j);??
- ????????????????int?p3?=?(i==0?||?j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j+1);??
- ????????????????int?p4?=?(j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i,j+1);??
- ????????????????int?p5?=?(i==size.height-1?||?j==size.width-1)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j+1);??
- ????????????????int?p6?=?(i==size.height-1)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j);??
- ????????????????int?p7?=?(i==size.height-1?||?j==0)?0:CV_IMAGE_ELEM(dst,uchar,i+1,j-1);??
- ????????????????int?p8?=?(j==0)?0:CV_IMAGE_ELEM(dst,uchar,i,j-1);??
- ????????????????int?p9?=?(i==0?||?j==0)?0:CV_IMAGE_ELEM(dst,uchar,i-1,j-1);??
- ??
- ????????????????if?((p2+p3+p4+p5+p6+p7+p8+p9)>=2?&&?(p2+p3+p4+p5+p6+p7+p8+p9)<=6)??
- ????????????????{??
- ????????????????????int?ap=0;??
- ????????????????????if?(p2==0?&&?p3==1)?++ap;??
- ????????????????????if?(p3==0?&&?p4==1)?++ap;??
- ????????????????????if?(p4==0?&&?p5==1)?++ap;??
- ????????????????????if?(p5==0?&&?p6==1)?++ap;??
- ????????????????????if?(p6==0?&&?p7==1)?++ap;??
- ????????????????????if?(p7==0?&&?p8==1)?++ap;??
- ????????????????????if?(p8==0?&&?p9==1)?++ap;??
- ????????????????????if?(p9==0?&&?p2==1)?++ap;??
- ??
- ????????????????????if?(ap==1)??
- ????????????????????{??
- ????????????????????????if?(p2*p4*p8==0)??
- ????????????????????????{??
- ????????????????????????????if?(p2*p6*p8==0)??
- ????????????????????????????{??
- ????????????????????????????????//標(biāo)記??
- ????????????????????????????????mFlag.push_back(make_pair(i,j));??
- ????????????????????????????}??
- ????????????????????????}??
- ????????????????????}??
- ????????????????}??
- ????????????}??
- ????????}??
- ????????//刪除??
- ????????for?(vector<pair<int,int>?>::iterator?i=mFlag.begin();?i!=mFlag.end();?++i)??
- ????????{??
- ????????????CV_IMAGE_ELEM(dst,uchar,i->first,i->second)?=?0;??
- ????????}??
- ??
- ????????//直到?jīng)]有點(diǎn)滿足,算法結(jié)束??
- ????????if?(mFlag.size()==0)??
- ????????{??
- ????????????break;??
- ????????}??
- ????????else??
- ????????{??
- ????????????mFlag.clear();//將mFlag清空??
- ????????}??
- ????}??
- }??
- ??
- int?main(int?argc,?char*argv[])??
- {??
- ????//獲取圖像??
- ????if?(argc!=2)??
- ????{??
- ????????cout?<<?"參數(shù)個(gè)數(shù)錯(cuò)誤!"<<endl;??
- ????????return?-1;??
- ????}??
- ????IplImage?*pSrc?=?cvLoadImage(argv[1],CV_LOAD_IMAGE_GRAYSCALE);??
- ????if?(!pSrc)??
- ????{??
- ????????cout?<<?"讀取文件失敗!"?<<?endl;??
- ????????return?-1;??
- ????}??
- ????IplImage?*pTemp?=?cvCreateImage(cvGetSize(pSrc),pSrc->depth,pSrc->nChannels);??
- ????IplImage?*pDst?=?cvCreateImage(cvGetSize(pSrc),pSrc->depth,pSrc->nChannels);??
- ??????
- ????//將原圖像轉(zhuǎn)換為二值圖像??
- ????cvThreshold(pSrc,pTemp,128,1,CV_THRESH_BINARY);???
- ????//圖像細(xì)化??
- ????thinImage(pTemp,pDst);??
- ??
- ????for?(int?i=0;?i<pDst->height;?++i)??
- ????{??
- ????????for?(int?j=0;?j<pDst->width;?++j)??
- ????????{??
- ????????????if(CV_IMAGE_ELEM(pDst,uchar,i,j)==1)??
- ????????????????CV_IMAGE_ELEM(pDst,uchar,i,j)=?255;??
- ????????}??
- ????}??
- ??
- ????namedWindow("src",CV_WINDOW_AUTOSIZE);??
- ????namedWindow("dst",CV_WINDOW_AUTOSIZE);??
- ????cvShowImage("src",pSrc);??
- ????cvShowImage("dst",pDst);??
- ??
- ????waitKey(0);??
- }??
??? 運(yùn)行效果
1原圖像
2.運(yùn)行效果
?
轉(zhuǎn)載于:https://www.cnblogs.com/donaldlee2008/p/5232035.html
總結(jié)
以上是生活随笔為你收集整理的【opencv】图像细化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android MVP模式的初识
- 下一篇: Oldboy28期linux决心书