首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >边梯度Python

边梯度Python
EN

Stack Overflow用户
提问于 2019-02-26 16:10:19
回答 2查看 1.5K关注 0票数 1

我有一个包含两类图像的数据集:城市景观和景观。我想要做的是计算每幅图像边缘的梯度(方向),并表明城市景观的图像比景观图像有更多的垂直/水平边缘。

我所做的是计算垂直,水平,45度和135度的边缘。我对图像应用了Canny滤波器,计算了x,y梯度,并对图像应用了一个阈值,显示了高于该阈值的边缘。这一阈值化的结果如下所示:

这是我的代码,用于处理图像以及计算渐变:

代码语言:javascript
复制
def gradient(image):    

    # Step 1
    img = image
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # Step 2
    bi = cv2.bilateralFilter(gray, 15, 75, 75)

    # Step 3
    dst = cv2.Canny(bi, 100, 200)
    #print(np.count_nonzero(dst))  #--> make sure it's not all zeroes

    # Step 4
    #--- create a black image to see where those edges occur ---
    mask = np.zeros_like(gray)

    #--- applying a threshold and turning those pixels above the threshold to white ---           
    mask[dst > 0.1 * dst.max()] = 255

    # Step 5
    img[dst > 0.1 * dst.max()] = [255, 0, 0]   #--- [255, 0, 0] --> Red ---

    Gx = cv2.Sobel(mask,cv2.CV_64F,1,0,ksize=5)
    Gy = cv2.Sobel(mask,cv2.CV_64F,0,1,ksize=5)

    #orientation of the edges
    theta = np.arctan2(Gy, Gx)

    #magnitude
    M = np.sqrt(Gx*Gx + Gy*Gy)

    #Vertical edges: 
    v = abs(Gy)

    #Horizontal edges: 
    h = abs(Gx)

    #45 Degree edges: 
    deg45 = M*abs(np.cos(theta - np.pi/4))

    #135 Degree edges: 
    deg135 = M*abs(np.cos(theta - 3*np.pi/4))

    print('Vertical:')
    #print(v)
    print(np.count_nonzero(v))
    print('Horizontal:')
    #print(h)
    print(np.count_nonzero(h))

我想要的是为上面的图像中显示为红色的边缘计算v,h,deg45,deg135 (步骤5)。如果这是不可能的,那么对具有白色边缘的图像执行此操作(步骤4)。有人能帮忙吗?

编辑:为了避免混淆,我想要做的是获取给定图像中的垂直、水平等边缘的数量,这样我就可以比较城市景观和景观图像的数字。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-26 18:13:47

如果您想要的是包含水平和垂直边缘的像素总数,我建议为水平和垂直(例如15度)定义一些阈值。因此,您可以计算thetaabs(theta) < pi/12 (水平)、abs(theta) > pi-pi/12 (水平)或pi/2 - pi/12 < abs(theta) < pi/2+pi/12 (垂直)的元素数。

vh中存储的是每个点上梯度的垂直和水平分量,您需要的是比较vh的值,以确定每个点的梯度向量是水平的还是垂直的。比较theta可能是最直观的方法。

为了得到θ中满足特定条件的元素数,我建议使用生成器表达式

代码语言:javascript
复制
sum(1 for i in theta if (abs(i)<pi/12) or (abs(i)>pi-pi/12))

例如,给出水平边缘像素的数目。

票数 2
EN

Stack Overflow用户

发布于 2020-12-03 23:32:17

我认为Hough变换更适合您的需要,如果您想要计数或控制您的图像中有多少线性特征,您可以计算每个特定方向的线性特征数(在hough空间中)。一旦您正在使用Python,链接可能会有帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54889712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档