拉普拉斯算子

拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。
我们经常把它作为边缘检测之一,也是工程数学中常用的一种积分变换,也可以用于图像增强、角点检测等等。

这里只给出它的代码,原理可参考其他博客及百科。
在图像处理中,拉普拉斯算子为离散的形式,其核心就是一个3✖3的卷积核。

# 图像增强算法
# 拉普拉斯算子,自编写实现,利用空域卷积运算实现滤波
# 具有图像增强效果,同时亦可用于边缘检测、角点检测import cv2
import numpy as np
import matplotlib.pyplot as pltif __name__ == '__main__':src = cv2.imread('enhance.jpg', 1)plt.subplot(3, 2, 1)plt.imshow(src)plt.axis('off')plt.title('Offical')kernel = np.array([[-1, -1, -1],[2, 2, 2],[-1, -1, -1]])horizontal_edge = cv2.filter2D(src, cv2.CV_32F, kernel)horizontal_edge = cv2.convertScaleAbs(horizontal_edge)# _, horizontal_edge = cv2.threshold(horizontal_edge, horizontal_edge.max() * 0.8, 255, cv2.THRESH_BINARY)plt.subplot(3, 2, 2)plt.imshow(horizontal_edge)plt.axis('off')plt.title('horizontal_edge')kernel = np.array([[-1, 2, -1],[-1, 2, -1],[-1, 2, -1]])vertical_edge = cv2.filter2D(src, ddepth=cv2.CV_32F, kernel=kernel)vertical_edge = cv2.convertScaleAbs(vertical_edge)# _, vertical_edge = cv2.threshold(vertical_edge, vertical_edge.max() * 0.8, 255, cv2.THRESH_BINARY)plt.subplot(3, 2, 3)plt.imshow(vertical_edge)plt.axis('off')plt.title('vertical_edge')kernel = np.array([[-1, -1, 2],[-1, 2, -1],[2, -1, -1]])positive_45_deg_edge = cv2.filter2D(src, ddepth=cv2.CV_32F, kernel=kernel)positive_45_deg_edge = cv2.convertScaleAbs(positive_45_deg_edge)# positive_45_deg_edge = cv2.threshold(positive_45_deg_edge, positive_45_deg_edge.max() * 0.8, 255, cv2.THRESH_BINARY)plt.subplot(3, 2, 4)plt.imshow(positive_45_deg_edge)plt.axis('off')plt.title('positive_45_deg_edge')kernel = np.array([[2, -1, -1],[-1, 2, -1],[-1, -1, 2]])negative_45_deg_edge = cv2.filter2D(src, ddepth=cv2.CV_32F, kernel=kernel)negative_45_deg_edge = cv2.convertScaleAbs(negative_45_deg_edge)# negative_45_deg_edge = cv2.threshold(negative_45_deg_edge, negative_45_deg_edge.max() * 0.8, 255, cv2.THRESH_BINARY)cv2.imshow('negative_45_deg_edge', negative_45_deg_edge)plt.subplot(3, 2, 5)plt.imshow(negative_45_deg_edge)plt.axis('off')plt.title('negative_45_deg_edge')plt.show()

结果展示:

LoG和DoG算子

LoG和DoG算子是拉普拉斯算子的改进方法。

LoG:高斯拉普拉斯算子(LoG,Laplacian of Gaussian),首先对图像进行高斯暖卷积滤波进行降噪处理,再采用Laplace算子进行边缘检测。

DoG:高斯函数差分(DoG, Difference of Gaussian), 是可以通过将图像与高斯函数进行卷积得到一幅图像的低通滤波结果,即去噪过程,这里的Gaussian和高斯低通滤波器的高斯一样,是一个函数,即为正态分布函数。同时,它对高斯拉普拉斯LoG的近似.

# 图像增强算法
# LoG和DoG算子
# 均为基于拉普拉斯算子的改进
# 可用于边缘检测和角点检测import cv2
import numpy as np
import matplotlib.pyplot as pltdef genGaussianKernel(ksize, sigma):half_ksize = ksize // 2C = 2 * np.pi * sigma * sigmax = y = np.linspace(-half_ksize, half_ksize, ksize)x, y = np.meshgrid(x, y)kernel = np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2)) / Creturn kerneldef zerosCrossing(src, thresh):dsize = (src.shape[1], src.shape[0])M = np.array([[1, 0, -1], [0, 1, 0]], dtype=np.float32)shift_left = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0, 1], [0, 1, 0]], dtype=np.float32)shift_right = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  0], [0, 1, -1]], dtype=np.float32)shift_up = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  0], [0, 1, 1]], dtype=np.float32)shift_down = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  1], [0, 1, 1]], dtype=np.float32)shift_right_down = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  -1], [0, 1, -1]], dtype=np.float32)shift_left_up = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  1], [0, 1, -1]], dtype=np.float32)shift_right_up = cv2.warpAffine(src, M, dsize)M = np.array([[1, 0,  -1], [0, 1, 1]], dtype=np.float32)shift_left_down = cv2.warpAffine(src, M, dsize)shift_left_right_sign = (shift_left * shift_right)shift_up_down_sign = (shift_up * shift_down)shift_rd_lu_sign = (shift_right_down * shift_left_up)shift_ru_ld_sign = (shift_right_up * shift_left_down)shift_left_right_norm = abs(shift_left - shift_right)shift_up_down_norm = abs(shift_up - shift_down)shift_rd_lu_norm = abs(shift_right_down - shift_left_up)shift_ru_ld_norm = abs(shift_right_up - shift_left_down)candidate_zero_crossing = \((shift_left_right_sign < 0) & (shift_left_right_norm > thresh)).astype('uint8') +\((shift_up_down_sign < 0) & (shift_up_down_norm > thresh)).astype('uint8') + \((shift_rd_lu_sign < 0) & (shift_rd_lu_norm > thresh)).astype('uint8') + \((shift_ru_ld_sign < 0) & (shift_ru_ld_norm > thresh)).astype('uint8')ResImg = np.zeros(shape=src.shape, dtype=np.uint8)ResImg[candidate_zero_crossing >= 2] = 255return ResImgdef LoG(src, ksize, sigma=0, thresh=None, alpha=0.01):blur_img = cv2.GaussianBlur(src.astype('float32'), (ksize, ksize), sigmaX=sigma)LoG_img = cv2.Laplacian(blur_img, cv2.CV_32F)if thresh is None:thresh = abs(LoG_img).max() * alphaedge_image = zerosCrossing(LoG_img, thresh)return edge_imagedef DoG(src, ksize, sigma, thresh=None, alpha=0.01):sigma2 = sigma / 1.6kernel_1 = genGaussianKernel(ksize=ksize, sigma=sigma)kernel_2 = genGaussianKernel(ksize=ksize, sigma=sigma2)kernel = kernel_1 - kernel_2DoG_img = cv2.filter2D(src=src, ddepth=cv2.CV_32FC1, kernel=kernel)if thresh is None:thresh = abs(DoG_img).max() * alphaedge_image = zerosCrossing(src=DoG_img, thresh=thresh)return edge_imageif __name__ == "__main__":src = cv2.imread('enhance.jpg', 1)plt.subplot(2, 2, 1)plt.imshow(src)plt.axis('off')plt.title('Offical')edge_log = LoG(src=src, ksize=25, alpha=0.05)plt.subplot(2, 2, 2)plt.imshow(edge_log)plt.axis('off')plt.title('LoG')edge_dog = DoG(src=src, ksize=25, sigma=4, alpha=0.1)plt.subplot(2, 2, 3)plt.imshow(edge_dog)plt.axis('off')plt.title('DoG')plt.show()

结果展示:

python 图像处理 拉普拉斯算子的实现和改进-LoG和DoG算子相关推荐

  1. 【图像处理】——Python图像分割边缘检测算法之二阶梯度算子(laplace、log、dog算子)

    目录 一.二阶算子简介 二.laplace(拉普拉斯算子) 1.什么是拉普拉斯算子 (1)连续二维函数的二阶导 (2)离散二维函数的二阶导数 2.常用算子模块及代码 3.结果 三.log算子 1.什么 ...

  2. 数字图像处理与Python实现-边缘检测-高斯差分(DoG)算子边缘检测

    高斯差分(DoG)算子边缘检测 高斯差分(DoG)算子边缘检测 1. 前言 2. 高斯差分(DoG)算子描述 3. 代码实现 1. 前言 在图像中,灰度或结构等信息的突变处称为边缘.边缘可以看作一个区 ...

  3. 数字图像处理——拉普拉斯算子【像素级别处理】(python)

    数字图像处理--拉普拉斯算子[像素级别处理](python) 文章目录 数字图像处理--拉普拉斯算子[像素级别处理](python) 简介: 代码实现 简介: 拉普拉斯算子是一种微分算子常在图像处理中 ...

  4. [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  5. 【数字图像处理】图像锐化:拉普拉斯算子(Laplacian)、高通滤波、Sobel算子、Isotropic算子、Prewitt算子

    图像锐化 图像锐化处理的目的是使模糊的图像变得更加清晰起来,通常针对引起图像模糊的原因而进行相应地锐化操作属于图像复原的内容.图像的模糊实质就是图像受到平均或积分运算造成的,因此可以对图像进行还原运算 ...

  6. Python 图像处理实用指南:1~5

    原文:Hands-On Image Processing with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 计算机视觉 译文集],采用译后编辑(MT ...

  7. Opencv Python图像处理进阶教程②

    Opencv Python图像处理进阶教程 概述: 代码: https://github.com/bai1231/opencv-learn_and_pratice 1. 图像卷积与应用 图像去噪 图像 ...

  8. python图像处理《数字图像处理与python实现》读书笔记二:空间滤波

    文章目录 重要! 第三章 空间滤波 概览 3.1 空间滤波基础 3.1.1 空间滤波的机理 3.1.2 空间滤波器模板 3.2 平滑处理 3.2.1 平滑线性空间滤波器 3.2.2 统计排序滤波器 3 ...

  9. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. Flask之异常处理
  2. 逆袭!? 期待下一个“BCH”出现
  3. 【渝粤教育】国家开放大学2019年春季 2114人体解剖生理学 参考试题
  4. WebMagic爬取58同城租房数据
  5. 淘宝弹性布局方案lib-flexible实践
  6. 22 FI配置-财务会计-定义收益留存科目(Retained Earning Account)
  7. 入门讲解:使用numpy实现简单的神经网络(BP算法)
  8. gridview中js的绑定问题 一个js的函数[转]
  9. VC6 Tips 002: WndTabs 插件
  10. bex5 mysql_bex5 库存系统的增删改查等功能对MYSQL数据库的维护操作 Windows Develop 276万源代码下载- www.pudn.com...
  11. PDF文件怎么转换成CAD格式?教你几种转换方法
  12. 项目管理中如何如何进行风险控制
  13. CSS3 - 新单位vw、vh、vmin、vmax使用详解(附样例)
  14. 三年级计算机帮助我们学本领,学本领作文_作文350字_三年级下册第四单元作文_第一范文网...
  15. php ligerui 导出excel,LigerUI表格树的使用
  16. STM32使用的相关知识点
  17. cross-request插件下载
  18. 英语中的非谓语动词小结
  19. Octave简明教程
  20. python拼多多1分抢手机_如何抢到拼多多1元秒杀?抢不到是怎么回事?

热门文章

  1. Android-APK瘦身实践:二次瘦身如何再减少大小?,2021年安卓开发进阶课程
  2. chinapay java_ECSHOP 银联电子支付(ChinaPay)插件 掉用JAVA签名
  3. Android近期错误
  4. Automatic Inference of Search Patterns for Taint-Style Vulnerabilities
  5. seo整站优化详细教程下载
  6. 实现物联网的技术要素
  7. SPARQL基础知识
  8. 使用describe()查看catering_sale.xls数据的基本情况,通过箱式图检测出catering_sale.xls中的异常值
  9. java程序设计之网络编程基础教程_Java程序设计之网络编程基础教程
  10. 一个毕业6年的程序员工作经历和成长感悟(上)