簡體   English   中英

在相機圖像中的顯示器上查找白色像素

[英]Finding white pixels on monitor in camera image

我有一個相機指向顯示器,顯示一行白色像素。 我從相機中獲取了一個字節值數組。 攝像機視圖的區域大於顯示器占用的空間。 我需要找出相機圖像上白色顯示器像素出現的位置。 請參見下面的示例圖片。 示例圖像

我需要改進我的算法,以便在不同的光照條件下更加穩健。 具體來說,我需要改進確定被認為是潛在白色像素的值閾值的步驟。 在確定可能是我的白色像素后,我找到最大的鄰域來確定我的最終白色值。

我還嘗試計算具有最高值的N個像素並將N個像素的最低值視為白色。 這在某些條件下工作得相當好,但是當房間稍微變暗時它停止工作。 我可以調整N在任何光照條件下工作,但我寧願不必手動提供任何參數。 我現在正在嘗試使用百分位數,但由於數據集非常大,因此運行速度非常慢。

這是一種方法合理的方法,但參數必須在不同的光照條件下進行調整。

std::multiset<uint8_t> maxPixelValues;
for(unsigned i = 0; i < width; ++i)
{
    for(unsigned j = 0; j <height; ++j)
    {
        uint8_t pixelValue = buffer[j * width + i];
        if(maxPixelValues.size() < topPixelCount)
        {
            maxPixelValues.insert(pixelValue);
        }
        else
        {
            auto minimumValuePosition = maxPixelValues.begin();
            if(pixelValue > *minimumValuePosition)
            {
                maxPixelValues.erase(minimumValuePosition);
                maxPixelValues.insert(pixelValue);
            }
        }
    }
}
return *maxPixelValues.begin();

首先,您可能希望以高於均值的一個標准偏差進行閾值處理,以擺脫屏幕的較暗部分。 然后,您可以利用這樣一個事實:與背景中的一些較亮區域相比,線條非常薄,並且由於屏幕的邊緣,它也遠離其他明亮區域。

偽代碼:

mask=threshold(img, mean(img)+stdev(img))
toignore=dilate(mask,3,3) 
toignore=erode(toignore,4,4) 
toignore=dilate(toignoe,3,3)
mask=mask &! toignore
  1. 閾值+ sd的閾值: 掩碼閾值為均值+ sd
  2. 擴張: 擴張
  3. 使用略大的內核進行侵蝕以移除1px的薄物體(例如線條),但保留靠近其他明亮物體的像素 侵蝕
  4. 擴張以添加小於屏幕邊框的邊距: 再次膨脹
  5. 來自1的閾值掩模與來自4的toignore排除: 掩蓋擴張/侵蝕/擴張的東西被忽略

剩下一些雜散像素,但你可以在這一點上進行霍夫變換。

您可以使用Hough變換在圖像上查找線條: http//en.wikipedia.org/wiki/Hough_transform

這是openCV api: http//docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM