什麼是快速和可靠的方式閾值圖像可能模糊和不均勻的亮度?快速圖像閾值
實施例(模糊但均勻的亮度):
因爲圖像是不能保證有均勻的亮度,這是不可行的使用固定的閾值。自適應閾值的作品還好,但由於模糊的它在功能產生斷裂和扭曲(在這裏,最重要的特點是獨位):
我也用直方圖均衡化嘗試(使用OpenCV的equalizeHist
函數)。它增加對比度而不減少亮度差異。
我發現的最好的解決方案是將圖像的形態學關閉(歸功於this post)以使亮度一致,然後重新歸一化,然後使用固定閾值(使用Otsu算法選擇最佳閾值水平) :
這裏是OpenCV的此代碼的Android:
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat(); // closed will have type CV_32F
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);
Core.divide(image, closed, closed, 1, CvType.CV_32F);
Core.normalize(closed, image, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Imgproc.threshold(image, image, -1, 255, Imgproc.THRESH_BINARY_INV
+Imgproc.THRESH_OTSU);
這個偉大的工程,但閉合動作很慢。減小結構元素的尺寸會提高速度,但會降低精度。
編輯:基於DCS的建議,我嘗試使用高通濾波器。我選擇了拉普拉斯濾波器,但我希望Sobel和Scharr濾波器有類似的結果。該濾波器在不包含特徵的區域中拾取高頻噪聲,並且由於模糊而遭受與自適應閾值類似的失真。它也需要與關閉操作一樣長。下面是一個15×15濾波器的例子:
編輯2:基於AruniRC的回答中,我使用Canny邊緣檢測的圖像上的與所述建議的參數:
double mean = Core.mean(image).val[0];
Imgproc.Canny(image, image, 0.66*mean, 1.33*mean);
我不確定如何自動自動微調參數獲取連接數字。
假設brigthness變化發生在低頻率,您可以嘗試在高通濾波圖像上設置閾值。但是,我不知道這些過濾器操作在移動設備上的速度有多快,而且我認爲您需要一個相當大的內核。 – DCS 2013-03-22 08:42:35
@DCS不幸的是,我不認爲高通濾波器可以工作。看到我的編輯到上面的帖子。 – 2013-03-22 22:25:37
由於您感興趣的功能涵蓋多個像素,因此如何將圖像先降低至較低分辨率?然後,您可以返回並以原始分辨率獲取更多細節,並使用較低分辨率的版本作爲蒙版。 – 2013-03-24 03:49:17