簡體   English   中英

使用houghcircle函數opencv python檢測不規則形狀

[英]Detection of irregular shapes using houghcircle function opencv python

我目前正在對圖像進行圓檢測看起來像這樣,但是一些墨滴合並並形成一些不規則的形狀(原始圖像中的紅色標記)。 我在opencv中使用houghcircle函數來檢測圓圈。 對於那些不規則的形狀,該功能只能將它們檢測為幾個小圓圈,但我真的希望程序將不規則形狀視為一個完整的大形狀並得到一個像我在輸出圖像中繪制的大圓圈。

原始圖像

輸出圖像

我的代碼將檢測所有圓圈並獲得它​​們的直徑。

這是我的代碼:

def circles(filename, p1, p2, minR, maxR):
# print(filename)
img  = cv2.imread(filename, 0)
img = img[0:1000, 0:1360]
l = len(img)
w = len(img[1])

cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 25,
                            param1 = int(p1) ,param2 = int(p2), minRadius = int(minR), maxRadius = int(maxR))

diameter = open(filename[:-4] + "_diamater.txt", "w")
diameter.write("Diameters(um)\n")
for i in circles[0,:]:
    diameter.write(str(i[2] * 1.29 * 2) + "\n")

count = 0
d = []
area = []
for i in circles[0,:]:
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)
    count += 1
    d += [i[2]*2]
    area += [i[2]*i[2]*pi*1.286*1.286]

f = filename.split("/")[-1]
cv2.imwrite(filename[:-4] + "_circle.jpg", cimg)

# cv2.imwrite("test3/edge.jpg", edges)
print "Number of Circles is %d" % count

diaM = []
for i in d:
    diaM += [i*1.286]

bWidth = range(int(min(diaM)) - 10, int(max(diaM)) + 10, 2)

txt = '''
Sample name: %s 
Average diameter(um): %f     std: %f
Drop counts: %d
Average coverage per drop(um^2): %f     std: %f
''' % (f, np.mean(diaM), np.std(diaM), count, np.mean(area), np.std(area))

fig = plt.figure()
fig.suptitle('Histogram of Diameters', fontsize=14, fontweight='bold')
ax1 = fig.add_axes((.1,.4,.8,.5))
ax1.hist(diaM, bins = bWidth)
ax1.set_xlabel('Diameter(um)')
ax1.set_ylabel('Frequency')
fig.text(.1,.1,txt)
plt.savefig(filename[:-4] + '_histogram.jpg')
plt.clf()

print "Total area is %d" % (w*l)
print "Total covered area is %d" % (np.sum(area))

rt = "Number of Circles is " + str(count) + "\n" + "Coverage percent is " + str(np.divide(np.sum(area), (w*l))) + "\n"
return rt

如果您仍想使用HoughCircles功能,您可以看到兩個圓圈是否重疊並從中創建一個新圓圈。

您可以使用minEnclosingCircle 找到圖像的輪廓,然后應用該功能將形狀檢測為圓形。

下面是一個帶有c ++代碼的簡單示例。 在你的情況下,我覺得你應該使用Hough-circle和minEnclosingCircle的組合,因為你的圖像中的某些圓圈彼此非常接近,它們有可能被檢測為單個輪廓。

輸入圖像:

輸入

界:

產量

Mat im = imread("circ.jpg");
Mat gr;
cvtColor(im, gr, CV_BGR2GRAY);
Mat bw;
threshold(gr, bw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
{
    Point2f center;
    float radius;
    minEnclosingCircle(contours[idx], center, radius);

    circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2);
}

如果你有這么漂亮的分離和對比模式,最簡單的方法是使用形狀索引。 本文本海報 在這兩種情況下,您都有一個形狀索引列表。

感謝形狀索引,您可以遵循以下內容:

  • 二進制圖像
  • 連接組件標簽以分隔每個模式
  • 計算形狀指數(大多數使用基本測量)
  • 根據形狀索引值對模式進行分類。

在你的具體情況下,圓形是完美的圓形,我會使用以下形狀索引:

  • 圓度=>僅使用半徑,在您的情況下最容易計算和完善。
  • 延伸/伸長/拉伸半徑=>在您的情況下完美,但所有庫中都沒有minium ball計算。
  • 等周邊缺陷=>非常容易計算,但由於周長,比圓形度稍微穩定一點。

也適用於您的情況:

  • 差距銘刻盤
  • 莫頓的傳播
  • 赤字
  • 直徑延長

暫無
暫無

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

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