2017-04-06 180 views
0

我正在實施用於試卷的OMR系統。但在確定實心圓時遇到問題。我已經成功地獲得了這些灰度區域的利益。OMR:評估填充圓圈

的問題是:
- 二進制閾值(自適應和固定)和計數非零像素賦予了很多,因爲在一個圓圈和移動相機做出來的照片亮度不同字母的錯誤。
- 也嘗試過使用這個survey中描述的技術,它使用圓圈的平均灰度值來標記它是否填充,但是當人們拍攝照片時,由於光源不同,圖像的亮度不一致,很多錯誤的結果。
- 人們也不遵循這樣的規則填充整個圈子,算法在這種情況下也需要很強大。
​​
我已經有大約10 GB的樣本,因此可能是機器學習或其他統計方法將是有用的。
有沒有人知道其他方法將圓圈分類爲填充?

+0

恐怕你的問題太廣泛了。有許多方法和許多可能的解決方案,但給出一個好的建議將需要更多的圖像和一些限制。到目前爲止,我的答案是:是的,有人知道其他方法將圓圈歸類爲填充。 – Piglet

+0

@vzhadeyev使用區域 –

+0

@JeruLuke的屬性檢查'查找輪廓',這會給我一些區域的輪廓陣列,從中我可以得到最大的輪廓或檢查它內部的填充像素的數量,但我仍然需要對像素數量進行一些固定的閾值來說明是否填充。這是你的觀點嗎? –

回答

0

由於它不是一個簡單的問題,因此需要進行大量的調整才能使其健壯。但我想建議你一個好的起點。你可以玩它,並嘗試使其工作。

import numpy as np 
import cv2 

image_ori = cv2.imread("circle_opt.png") 

lower_bound = np.array([0, 0, 0]) 
upper_bound = np.array([255, 255, 195]) 
image = image_ori 

mask = cv2.inRange(image_ori, lower_bound, upper_bound) 
masked_red = cv2.bitwise_and(image, image, mask=mask) 

kernel = np.ones((3,3),np.uint8) 
closing = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) 

contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, 
     cv2.CHAIN_APPROX_SIMPLE)[0] 
contours.sort(key=lambda x:cv2.boundingRect(x)[0]) 

print len(contours) 
for c in contours: 
    (x,y),r = cv2.minEnclosingCircle(c) 
    center = (int(x),int(y)) 
    r = int(r) 
    if 10 <= r <= 15: 
     cv2.circle(image,center,r,(0,255,0),2) 

# cv2.imwrite('omr_processed.png', image_ori) 
cv2.imshow("original",image_ori) 
cv2.waitKey(0) 

我從我的代碼有您共享圖像上的結果是這個

Green circles

您可以將閾值以這些綠色盤旋補丁再算上非零來得到,如果圓被標記或不標記。您可以使用lower和upper_bound來嘗試使解決方案健壯。

希望這會有所幫助!祝你的問題解決:)

+0

獲取TypeError:'key'是這個函數的一個無效關鍵字參數 –

+0

這是在python 2.7上測試的,試一試。或者修改代碼以使用您正在使用的版本。 – harshkn

+0

是的,使用相同的環境。不知道爲什麼它傳遞給排序函數時會出現這個錯誤,所以也不知道要糾正什麼。之前沒有使用'鑰匙'。 –