簡體   English   中英

給定一個圖像,一個像素點和一個以像素為單位的半徑。 如何找到它創建的圓形邊框的像素坐標

[英]Given a image, a pixel point and a radious in pixels. How do I find the pixel coordenate of the circle border it creates

給定一個圖像矩陣,我想找到給定圓的邊界中所有點/像素的像素點坐標,中心為 (x,y),其中 x 和 y 是整數,半徑為 r,其中 r 也是 Z157EDB75DF53009B3767666 考慮到邊框是 1 像素厚。 只有這個外邊緣是我需要找到的。 我遇到了麻煩,因為我只有整數可以使用。 我嘗試了曼哈頓距離,但它給了我一個旋轉 45 度的正方形。 我真的不知道如何前進

您可以使用cos獲取 x 分量,並使用sin獲取 y 分量

center = [5,5]
r = 12
steps = 500
rads_of_circle = numpy.linspace(-2*numpy.pi,2*numpy.pi,steps)
xs = center[0] + numpy.cos(rads_of_circle) * r
ys = center[1] + numpy.sin(rads_of_circle) * r
border_points = zip(xs,ys)

這會給你浮點數............如果你只想要整數,只需使用.round()

我看到了你的最后一個問題,看來你需要擴大圈子。

請注意,圓周像素的簡單繪制可能會產生小的空白空間。 繪制半徑為 1,2,...,n 的圓的示例:

在此處輸入圖像描述

但是你可以像 Bresenham 的那樣完成 integer 畫圓算法。

將 r 值一一增加。 在第一個八分圓中使用 Bresenham 算法生成像素坐標序列。 如果像素尚未填充(從另一個單元格中心),則繪制像素,並檢查下部像素是否已填充 - 如果未填充,則繪制它以刪除空白空間。 對 7 個對稱像素及其相鄰像素執行相同操作(第二個八分圓的底部,依此類推)

假設中心是原點(如果不是,您可以輕松翻譯),您所追求的是由定義的區域的輪廓

x² + y² - r² ≤ 0.

對於給定的 x,這是驗證約束的最大 y。 換句話說,

x² + y² - r² ≤ 0 < x² + (y+1)² - r² = x² + y² - r² + 2y + 1.

現在如果你增加 x,

(x+1)² + y² - r² = x² + y² - r² + 2x + 1 ≤ 0 < (x+1)² + (y+1)² = x² + y² - r² + 2x + 2y + 2

可能會變為假,您需要通過減少它來調整 y。

這就是圓增量算法的精髓。 您保持 x² + y² - r² 更新並逐個單元地進行 x、y 調整。 這只涉及 integer 算術。 其實只是加減比較,因為坐標每次最多相差一個。 曲線將是連續的。

我沒有提到一點復雜性,這意味着八種不同的情況:x 和 y 可能需要遞增或遞減,x 可以比 y 變化得更快,或者相反。 這些對應於八個主要八分圓中的平面分解。

暫無
暫無

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

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