![](/img/trans.png)
[英]C++ image library - finding pixels of a colour and making them white, everything else black
[英]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
剩下一些雜散像素,但你可以在這一點上進行霍夫變換。
您可以使用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.