一種改進的OPenCV區域性 自適應快速二值化

2021-08-07 09:33:04 字數 1621 閱讀 4240

由於用opencv自帶的函式adaptivethreshold()在光照不均勻的影象中進行二值化時,效果不佳,之後看了derek bradley和gerhard roth於2023年寫的《adaptive thresholding using the integral image》,方法簡單實現簡便且速度較快,本文基於opencv用程式實現了它。其核心思想可以由下面兩張圖概括,先得到影象中

各處的畫素值(影象為單通道),如圖1左。之後得到每個點的左上方所有點的畫素值之和(包括該點)並可用乙個二維陣列暫時儲存,如圖一右所示,例如,第二行第二列中9=4+0+4+1,第二行第三列中12=4+1+2+4+1。一般地,所謂二值化就是給定乙個閾值,當影象中某一點的畫素值大於閾值時令它的畫素為255(0),畫素值小於閾值時為0(255)。而所謂區域二值化,就是把劃分為若干的區域,每個區域有各自的閾值,再分別判定。

圖1  

如圖2所示,我們要判定區域d時,就可以利用圖1右的表,設p(x,y)為點(x,y)的畫素值(已轉換為圖一右的值),對於區域d有,p(d)=p(x2,y2)-p(x2,y1)-p(x1,y2)+p(x1,y1),得到區域d的總閾值,再除以區域d的畫素點個數得到平均閾值p=p(d)/n,對於區域中心點(i,j)若p(i,j)>p,則重寫點(i,j)的畫素為255(0),反之為0(255)。

圖2實現的**如下:

[cpp]view plain

copy

print?

void adaptivethereshold(mat src,mat dst)  

for(int i=0;i  

}  for(int i=0;i  

}  for (int i = 0 ; i 

delete  argv;  

}  

void adaptivethereshold(mat src,mat dst)	}	

for(int i=0;i=w)

x2=w-1;

if(y1<0)

y1=0;

if(y2>=h)

y2=h-1;

count=(x2-x1)*(y2-y1);

sum=argv[y2][x2]-argv[y1][x2]-argv[y2][x1]+argv[y1][x1];

if((long long)(dst.at(j,i)*count)

dst.at(j,i)=0;

else

dst.at(j,i)=255;

} }for (int i = 0 ; i < dst.rows; ++i)

delete argv;

}

效果如圖所示:

學習一種矩形通過css定義寬高等比例自適應的方法

參考資料1 參考資料2 參考資料3 1 原理 當用百分比定義高寬的時候以及padding的時候,paddingmargin相對于父元素的寬度來計算的,我們可以利用這一屬性來實現我們的需求,通過設定元素的 width 50 padding bottom 50 height 0 item2 修改為可設定...

opencv 一種聚焦評價函式

聚焦評價函式,對於自動聚焦的實現,具有重要的意義。聚焦評價函式有很多,每種方法都有其優點和缺點,本文所記錄的,只是其中一種方法,個人覺得是簡單實用的。原理很簡單,越是清晰的 每個畫素與其周圍畫素的差距越大,當聚焦不對時,會發現,整個影象糊成一團,即畫素值都在某一小範圍內。int calculateg...

桌面軟體底層日誌的一種改進設計

為此需要改變原來的以文字檔案充當日誌檔案的做法,改用sqlite資料庫檔案來充當日誌檔案。採用sqlite資料庫檔案充當日誌檔案,一是可以只採用乙個日誌檔案,二是可以開發相關的日誌分析工具。特別是在並行處理系統中,日誌是一種重要的除錯手段。基於資料庫的分析工具毫無疑問要比基於文字檔案的分析工具更為強...