国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 婺源县| 大连市| 英德市| 双鸭山市| 哈尔滨市| 崇义县| 渑池县| 昌吉市| 当雄县| 内乡县| 芜湖市| 连城县| 资源县| 蓬溪县| 隆安县| 内黄县| 图们市| 安丘市| 望江县| 迁安市| 中江县| 南投市| 沂水县| 澳门| 江川县| 金塔县| 饶河县| 南京市| 民县| 义马市| 许昌市| 晋州市| 屯昌县| 武汉市| 固安县| 文山县| 文山县| 同仁县| 大渡口区| 东光县| 德惠市|