前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python实现索伯尔算子[通俗易懂]

Python实现索伯尔算子[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-14 11:12:01
6060
发布2022-09-14 11:12:01
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

Python实现索伯尔算子

最近在学习Python,正好用sobel算子练练手,将就看看吧 先放原图

在这里插入图片描述
在这里插入图片描述

用Opencv中sobel算子做一下对比:

代码语言:javascript
复制
# OpenCV
    ori_img = cv.imread("C:\\Users\\BLYX\\Desktop\\test\\temple1.jpg")
    x = cv.Sobel(ori_img[:, :, 0], cv.CV_16S, 1, 0)
    y = cv.Sobel(ori_img[:, :, 0], cv.CV_16S, 0, 1)
    absX = cv.convertScaleAbs(x)
    absY = cv.convertScaleAbs(y)
    dst = cv.addWeighted(absX, 0.5, absY, 0.5, 0)
    cv.imshow("OpenCV's Result", dst)

    cv.waitKey(0)
    cv.destroyAllWindows()

结果图如下

在这里插入图片描述
在这里插入图片描述

然后用自己写的sobel实现如下:

代码语言:javascript
复制
 # self—design

def convertu8(num):
    if num > 255 or num < -255:
        return 255
    elif -255 <= num <= 255:
        if abs(num - int(num)) < 0.5:
            return np.uint8(abs(num))
        else:
            return np.uint8(abs(num)) + 1


def sobel(img, k=0):
    row = img.shape[0]
    col = img.shape[1]
    image = np.zeros((row, col), np.uint8)
    s = time.time()
    for i in range(1, row - 1):
        for j in range(1, col - 1):
            y = int(img[i - 1, j + 1, k]) - int(img[i - 1, j - 1, k]) + 2 * (
                        int(img[i, j + 1, k]) - int(img[i, j - 1, k])) + int(img[i + 1, j + 1, k]) - int(
                img[i + 1, j - 1, k])
            x = int(img[i + 1, j - 1, k]) - int(img[i - 1, j - 1, k]) + 2 * (
                        int(img[i + 1, j, k]) - int(img[i - 1, j, k])) + int(img[i + 1, j + 1, k]) - int(
                img[i - 1, j + 1, k])
            image[i, j] = convertu8(abs(x) * 0.5 + abs(y) * 0.5)
    e = time.time()
    print(e - s)
    return image


if __name__ == '__main__':
    ori_img = cv.imread("C:\\Users\\BLYX\\Desktop\\test\\temple1.jpg")
    sobelimage = sobel(ori_img, 0)
    cv.imshow("my Result", sobelimage)
    cv.waitKey(0)
    cv.destroyAllWindows()

结果图如下

在这里插入图片描述
在这里插入图片描述

然后用ENVI比对了一下:

在这里插入图片描述
在这里插入图片描述

***blablablabla 可以看到三幅图相对比,第二幅图的视觉效果更好,当然不同的图片可能会对最终的结果产生影响。但经多组图片测试,可以得到在对水平锐化和垂直锐化图像赋予相同的权重叠合时,第二幅结果图在视觉上稍微优于OpenCV中的sobel,而在处理效率上却要低上很多。希望未来能够改进一下。 写得不好,还望大家指正!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158981.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python实现索伯尔算子
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档