1. 程式人生 > >邊緣檢測的各種暢想

邊緣檢測的各種暢想

strong 一個 幫助 很多 arch sig 並且 blog 相減

一直以來對OpenCV的邊緣檢測不滿意,現在的邊緣檢測主要是基於各種算子,很多時候,邊緣沒辦法非常細致的分割出來,後面ML的加入提供了更多的思路,在這裏記錄一下,最近的一些探索和想法,首先上一張圖。

技術分享圖片

目的在於提取圖像中黑色紋路的地方,嘗試過邊緣增強,對比度增強算法,各種enhancement。

效果很不明顯,尤其是做了以下mat的背景相減,會發現其實陰影區域的像素值跟其他區域的差距很不明顯:https://www.cnblogs.com/tornadomeet/archive/2012/06/02/2531705.html

,後面又嘗試了基於OpenCV的陰影識別和提取。

嘗試包括:

在運動目標檢測中,常常會出現由於光線被遮擋,或場景其他物體的遮擋,在目標附近或場景裏出現陰影,陰影的出現對後期目標的正確分割與處理帶了很大的不便。如今,國內外已有不少文獻來研究這個問題,並且提出了各種各樣的陰影去除算法。本文就其中的一種算法提出了一個通用的實現算法,該算法考慮了背景與前景顏色相近的情況,希望能給大家一些幫助:(介紹下算法的思路:算法首先對RGB顏色空間的值進行歸一化處理,即:r=R/(R+G+B),g=G/(R+G+B), I=(R+G+B)/3。然後利用背景和當前幀r,g的插值和I的比例來確定陰影區域:

詳細細節請參考文獻:Detecting moving objects,ghosts and shadows in video streams code:
// shadeImg is a binary image,the value th2 and th3 are chosen empirically here,set th2=0.6 th3=1.5, th4=7
void ShadeDetect(IplImage *currImg, IplImage *bkImg, IplImage *shdadeImg,double
th1,double th2,double th3,double th4) { cvZero(shdadeImg); unsigned char* currData; unsigned char* bkData; unsigned char* shadeData; int i=0,j=0; int height=currImg->height; int width=currImg->width; double rb=0,gb=0,Ib=0,Rb=0,Gb=0,Bb=0;
double rt=0,gt=0,It=0,Rt=0,Gt=0,Bt=0; //CvScalar cs=cvScalarAll(255); for (i=0;i<height;i++) { currData=(unsigned char*)currImg->imageData+i*currImg->widthStep; bkData=(unsigned char*)bkImg->imageData+i*bkImg->widthStep; shadeData=(unsigned char*)shdadeImg->imageData+i*shdadeImg->widthStep; for (j=0;j<width;j++) { // current normalized Rt=currData[j*3]; Gt=currData[j*3+1]; Bt=currData[j*3+2]; rt=Rt/(Rt+Gt+Bt); gt=Gt/(Rt+Gt+Bt); It=(Rt+Gt+Bt)/3; // Bk normalized Rb=bkData[j*3]; Gb=bkData[j*3+1]; Bb=bkData[j*3+2]; rb=Rb/(Rb+Gb+Bb); gb=Gb/(Rb+Gb+Bb); Ib=(Rb+Gb+Bb)/3; // judge whether is shadeimg if (fabs(rt-rb)<=th1 && fabs(gt-gb)<th1 && It/Ib>=th2 && It/Ib<=th3 && fabs(It-Bt)<th4) { shadeData[j]=255; } } } }

代碼改成mat格式,發現沒有th1,把論文也擼了一遍也沒看到,自己嘗試了一些經驗值,發現沒啥效果。

嘗試二、

邊緣檢測的各種暢想