私はすべての光学サークルを検出しようとしていましたが、円のエッジがかなり壊れているという難点に直面しています。他の場所では、ノイズが原因で2値化された後にサークル同士が接触しています。それを解決する方法はありますか?ノイズが存在する場合は円を切断し、エッジが壊れている場合は円を検出する方法は?
pattern = [{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9},
{0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9}
]
stringLen = len(pattern)
blobCnts = sum([len(d) for d in pattern])
raw_image = cv2.imread(imagePath)
gray = cv2.cvtColor(raw_image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,
cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
bloblist = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
blobcnts = contours.sort_contours(bloblist)[0]
contour_list = []
sorted_contour = []
for blob in blobcnts:
approx = cv2.approxPolyDP(blob,0.01*cv2.arcLength(blob,True),True)
area = cv2.contourArea(blob)
(x,y),r = cv2.minEnclosingCircle(blob)
center = (int(x),int(y))
r = int(r)
if ((len(approx) >= 8) & (len(approx) <= 23) & (area > 30) & (8 < r < 20)):
contour_list.append(blob)
numlist = []
if blobCnts == len(contour_list):
for (l, i) in enumerate(np.arange(0, blobCnts, stringLen)):
cnts = contours.sort_contours(contour_list[i:i + 10],method="top-to-bottom")[0]
numlist.append(cnt)
print cnt
私はそれを適用するが、私はそれは私の要件 – Zara
ごとに微調整をすることはできませんよ、私は実装が、どのように私はすべての画像のためのいくつかのパラメータを修正することができますか?照明に基づいて変化しています – Zara
関数にはcannyのしきい値を定義するparam1が含まれています。私はそれを最初に30に設定しました。その時100個のサークルから99個のサークルがいくつかのサンプルで得られました。後で、私がそれを減らしたときに、100サークルを検出するレートが減少しました。後で、私は最初にcannyでエッジを検出し、次にこの関数への入力としてエッジ画像を渡しました。その後、58サンプルから2つだけが拒絶された。だから、私はこのシナリオの結論は何かを尋ねたいだけです。 – Zara