国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實(shí)現(xiàn)霍夫圓和橢圓變換代碼詳解

2020-02-16 11:37:10
字體:
供稿:網(wǎng)友

在極坐標(biāo)中,圓的表示方式為:

x=x0+rcosθ

y=y0+rsinθ

圓心為(x0,y0),r為半徑,θ為旋轉(zhuǎn)度數(shù),值范圍為0-359

如果給定圓心點(diǎn)和半徑,則其它點(diǎn)是否在圓上,我們就能檢測出來了。在圖像中,我們將每個(gè)非0像素點(diǎn)作為圓心點(diǎn),以一定的半徑進(jìn)行檢測,如果有一個(gè)點(diǎn)在圓上,我們就對這個(gè)圓心累加一次。如果檢測到一個(gè)圓,那么這個(gè)圓心點(diǎn)就累加到最大,成為峰值。因此,在檢測結(jié)果中,一個(gè)峰值點(diǎn),就對應(yīng)一個(gè)圓心點(diǎn)。

霍夫圓檢測的函數(shù):

skimage.transform.hough_circle(image, radius)

radius是一個(gè)數(shù)組,表示半徑的集合,如[3,4,5,6]

返回一個(gè)3維的數(shù)組(radius index, M, N), 第一維表示半徑的索引,后面兩維表示圖像的尺寸。

例1:繪制兩個(gè)圓形,用霍夫圓變換將它們檢測出來。

import numpy as npimport matplotlib.pyplot as pltfrom skimage import draw,transform,featureimg = np.zeros((250, 250,3), dtype=np.uint8)rr, cc = draw.circle_perimeter(60, 60, 50) #以半徑50畫一個(gè)圓rr1, cc1 = draw.circle_perimeter(150, 150, 60) #以半徑60畫一個(gè)圓img[cc, rr,:] =255img[cc1, rr1,:] =255fig, (ax0,ax1) = plt.subplots(1,2, figsize=(8, 5))ax0.imshow(img) #顯示原圖ax0.set_title('origin image')hough_radii = np.arange(50, 80, 5) #半徑范圍hough_res =transform.hough_circle(img[:,:,0], hough_radii) #圓變換 centers = [] #保存所有圓心點(diǎn)坐標(biāo)accums = [] #累積值radii = [] #半徑for radius, h in zip(hough_radii, hough_res): #每一個(gè)半徑值,取出其中兩個(gè)圓 num_peaks = 2 peaks =feature.peak_local_max(h, num_peaks=num_peaks) #取出峰值 centers.extend(peaks) accums.extend(h[peaks[:, 0], peaks[:, 1]]) radii.extend([radius] * num_peaks)#畫出最接近的圓image =np.copy(img)for idx in np.argsort(accums)[::-1][:2]: center_x, center_y = centers[idx] radius = radii[idx] cx, cy =draw.circle_perimeter(center_y, center_x, radius) image[cy, cx] =(255,0,0)ax1.imshow(image)ax1.set_title('detected image')

結(jié)果圖如下:原圖中的圓用白色繪制,檢測出的圓用紅色繪制。

例2,檢測出下圖中存在的硬幣。

import numpy as npimport matplotlib.pyplot as pltfrom skimage import data, color,draw,transform,feature,utilimage = util.img_as_ubyte(data.coins()[0:95, 70:370]) #裁剪原圖片edges =feature.canny(image, sigma=3, low_threshold=10, high_threshold=50) #檢測canny邊緣fig, (ax0,ax1) = plt.subplots(1,2, figsize=(8, 5))ax0.imshow(edges, cmap=plt.cm.gray) #顯示canny邊緣ax0.set_title('original iamge')hough_radii = np.arange(15, 30, 2) #半徑范圍hough_res =transform.hough_circle(edges, hough_radii) #圓變換 centers = [] #保存中心點(diǎn)坐標(biāo)accums = [] #累積值radii = [] #半徑for radius, h in zip(hough_radii, hough_res): #每一個(gè)半徑值,取出其中兩個(gè)圓 num_peaks = 2 peaks =feature.peak_local_max(h, num_peaks=num_peaks) #取出峰值 centers.extend(peaks) accums.extend(h[peaks[:, 0], peaks[:, 1]]) radii.extend([radius] * num_peaks)#畫出最接近的5個(gè)圓image = color.gray2rgb(image)for idx in np.argsort(accums)[::-1][:5]: center_x, center_y = centers[idx] radius = radii[idx] cx, cy =draw.circle_perimeter(center_y, center_x, radius) image[cy, cx] = (255,0,0)ax1.imshow(image)ax1.set_title('detected image')            
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 大渡口区| 会昌县| 寻乌县| 三穗县| 万州区| 海淀区| 象山县| 天峻县| 鞍山市| 张家川| 庆城县| 保靖县| 长垣县| 额尔古纳市| 凉城县| 武宣县| 张北县| 小金县| 宁陵县| 临颍县| 泸定县| 丰宁| 沙河市| 都昌县| 常宁市| 平谷区| 赤城县| 尼木县| 千阳县| 塔城市| 武山县| 五常市| 丰台区| 麻江县| 平舆县| 麻江县| 习水县| 雷山县| 屯昌县| 西贡区| 修水县|