局部處理的邊緣連接(python+opencv)


rt

import cv2
import numpy as np

path = "_lo.png"
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = gray / 255.0 #像素值0-1之間

#sobel算子分別求出gx,gy
gx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)
gy = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3)
mag, ang = cv2.cartToPolar(gx, gy, angleInDegrees=1) #得到梯度幅度和梯度角度陣列
g = np.zeros(gray.shape) #g與圖片大小相同

#行掃描,間隔k時,進行填充,填充值為1
def edge_connection(img, size, k):
    for i in range(size):
        Yi = np.where(img[i, :] > 0)
        if len(Yi[0]) >= 10: #可調整
            for j in range(0, len(Yi[0])-1):
                if Yi[0][j+1] - Yi[0][j] <= k:
                    img[i, Yi[0][j]:Yi[0][j+1]] = 1
    return img

#選取邊緣,提取邊緣坐標,將g中相應坐標像素值設為1
X, Y = np.where((mag > np.max(mag) * 0.3)&(ang >= 0)&(ang <= 90))
g[X, Y] = 1

#邊緣連接,此過程只涉及水平,垂直邊緣連接,不同角度邊緣只需旋轉相應角度即可
g = edge_connection(g, gray.shape[0], k=20)
g = cv2.rotate(g, 0)
g = edge_connection(g, gray.shape[1], k=20)
g = cv2.rotate(g, 2)

cv2.imshow("img", img)
cv2.imshow("g", g)
cv2.waitKey(0)

為了看起來方便,原圖手動扣了部分


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM