yizhiyu_hh 2022-07-31 21:36 采纳率: 75%
浏览 18

根据边缘信息计算梯度,sobel失效了?

问题遇到的现象和发生背景

img

img

问题相关代码,请勿粘贴截图
import cv2
import random
import math
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

maskpath = './12.jpg'
imagepath = './Image/12.jpg'
img = cv2.imread(imagepath)
mask = cv2.imread(maskpath)

h_w = img.shape
height = h_w[0]
weight = h_w[1]

gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
gray_mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY)
# imgG = cv2.GaussianBlur(gray_img, (3, 3), 5)
imgG = cv2.medianBlur(gray_img, 5)
cv2.imshow('imgG', imgG)

empty_img = np.zeros((height, weight, 3), np.uint8)
# print(empty_img)
ret, thresh = cv2.threshold(gray_mask, 127, 255, 0)
_, contours, hierarchy = cv2.findContours(thresh, 2, 1)

# Gx = np.array([[-1, 0, 0, 0, 1],
#                [0, 0, 0, 0, 0],
#                [-2, 0, 0, 0, 2],
#                [0, 0, 0, 0, 0],
#                [-1, 0, 0, 0, 1]])
Gx = np.array([[-1, 0, 1],

               [-2, 0, 2],

               [-1, 0, 1]])
Gy = np.transpose(Gx)
# print(Gy)

def cpt_grad(dst_mat):
    # dst_mat = np.empty((3,3))
    gx = signal.convolve(dst_mat,Gx, mode='valid')
    gy = signal.convolve(dst_mat,Gy, mode='valid')
    all_grad = math.sqrt(gx*gx + gy*gy)

    return all_grad
# print(len(contours))
# print(contours)
# cv2.imshow('imgG',mask)
# plt.imshow(mask)
for cnt in contours:
    for pix in cnt:
        # print(pix)
        for i in pix:
            length = len(i)
            # print(i[0],i[1])
            # img_mat = np.array([[imgG[i[0]-2,i[1]-2], 0, imgG[i[0],i[1]-2], 0, imgG[i[0]+2,i[1]-2]],
            #                     [0, 0, 0, 0, 0],
            #                      [imgG[i[0]-2,i[1]], 0, imgG[i[0],i[1]], 0, imgG[i[0]+2,i[1]]],
            #                     [0, 0, 0, 0, 0],
            #                      [imgG[i[0]-2,i[1]+2], 0, imgG[i[0],i[1]+2], 0, imgG[i[0]+2,i[1]+2]]])
            img_mat = np.array([[imgG[i[0] - 1, i[1] + 1], imgG[i[0], i[1] + 1], imgG[i[0] + 1, i[1] + 1]],

                                [imgG[i[0] - 1, i[1]], imgG[i[0], i[1]], imgG[i[0] + 1, i[1]]],

                                [imgG[i[0] - 1, i[1] - 1], imgG[i[0], i[1] - 1], imgG[i[0] + 1, i[1] - 1]]])
            print(img_mat)
            # print(img_mat)
            pix_grad = cpt_grad(img_mat)
            # print('这是我们计算的梯度:',pix_grad)

            # gy = imgG[i[0],i[1]]*1 + imgG[i[0],i[1]+1]*2 + imgG[i[0],i[1]+2]*1-imgG[i[0]+2,i[1]]*1-imgG[i[0+2]]
            # print(i)
            #     print(cnt)
            # cv2.line(mask, tuple(i), tuple(i + 1), (255, 255, 255), 2)
            cv2.line(empty_img, tuple(i), tuple(i + 1), (255, 0, 0), 1)
            if pix_grad < 20:
                print('grad小于20的像素点坐标:',(i[0], i[1]))

                empty_img[i[1], i[0]] = (0, 0, 255)
                # empty_img[i[1], i[0]-1] = (0, 0, 255)
                # empty_img[i[1], i[0]+1] = (0, 0, 255)
cv2.imwrite('./grad_img1.jpg', empty_img)
cv2.imshow('contours', empty_img)
cv2.waitKey()

运行结果及报错内容

使用第二幅图的边缘信息,计算第一幅图对应位置的梯度信息,我也做了一些尝试,我将梯度小于20的像素标为红色,但是效果并不理想。结果如下图。

img

我的解答思路和尝试过的方法

我主要使用了sobel算子作为计算梯度的工具,将x,y方向计算的值相加。

我想要达到的结果

我想根据第二幅图的边缘点的位置信息获取第一幅图对应位置的梯度值,也就是求第一幅图的边缘梯度。所求梯度在正常的边缘上应该具有明显梯度值,而在红色圆圈处计算的梯度是较小的。

  • 写回答

1条回答 默认 最新

  • 爱晚乏客游 2022-08-01 09:18
    关注

    你这第二张图和第一张图根本就不是同一个图像出来的,你确定第二张图的边缘信息和第一张图能对的上?点都对应不了你这么求没啥意义。
    不然你就以第二张图为mask,将轮廓外的置为255,然后贴到第一张图上面去做mask,你看下剩下结果是不是都是边缘

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月31日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂