目录

图像锐化概述

算法方法介绍

代码实现

效果展示


图像锐化概述

图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空间域处理和频域处理两类。图像锐化是为了突出图像上地物的边缘、轮廓,或某些线性目标要素的特征。这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强。

算法方法介绍

Roberts算子,又称罗伯茨算子,是一种最简单的算子,是一种利用局部差分算子寻找边缘的算子。他采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测垂直边缘的效果好于斜向边缘,定位精度高,对噪声敏感,无法抑制噪声的影响。

Prewitt算子是一种一阶微分算子的边缘检测,利用像素点上下、左右邻点的灰度差,在边缘处达到极值检测边缘,去掉部分伪边缘,对噪声具有平滑作用 。其原理是在图像空间利用两个方向模板与图像进行邻域卷积来完成的,这两个方向模板一个检测水平边缘,一个检测垂直边缘。

索贝尔算子是把图像中每个像素的上下左右四领域的灰度值加权差,在边缘处达到极值从而检测边缘。索贝尔算子主要用作边缘检测。索贝尔算子不但产生较好的检测效果,而且对噪声具有平滑抑制作用,但是得到的边缘较粗,且可能出现伪边缘。

在边缘检测中,常用的一种模板是Sobel 算子。Sobel 算子有两个,一个是检测水平边缘的 ;另一个是检测垂直边缘的 。与Prewitt算子相比,Sobel算子对于象素的位置的影响做了加权,可以降低边缘模糊程度,因此效果更好。

Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。通常情况下,其算子的系数之和需要为零。

Scharr算子是对Sobel算子差异性的增强,因此两者之间的在检测图像边缘的原理和使用方式上相同。Scharr算子的边缘检测滤波的尺寸为3×3,因此也有称其为Scharr滤波器。可以通过将滤波器中的权重系数放大来增大像素值间的差异,弥补Sobel算子对图像中较弱的边缘提取效果较差的缺点。

Canny边缘检测是一种非常流行的边缘检测算法,是John Canny在1986年提出的。它是一个多阶段的算法,即由多个步骤构成。

  1. 应用高斯滤波来平滑图像,目的是去除噪声
  2. 找寻图像的强度梯度(intensity gradients)
  3. 应用非最大抑制(non-maximum suppression)技术来消除边误检(本来不是但检测出来是)
  4. 应用双阈值的方法来决定可能的(潜在的)边界
  5. 利用滞后技术来跟踪边界

最优边缘检测的特征:

  • 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报
  • 高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近
  • 最小响应: 图像中的边缘只能标识一次

设置两个阈值,其中一个为高阈值 maxVal,另一个为低阈值 minVal。根据当前边缘像素的梯度值(指的是梯度幅度,下同)与这两个阈值之间的关系,判断边缘的属性。具体步骤为:
(1)如果当前边缘像素的梯度值大于或等于 maxVal,则将当前边缘像素标记为强边缘。
(2)如果当前边缘像素的梯度值介于 maxVal 与 minVal 之间,则将当前边缘像素标记为虚
边缘(需要保留)。
(3)如果当前边缘像素的梯度值小于或等于 minVal,则抑制当前边缘像素。
当函数 cv2.Canny()的参数 threshold1 和 threshold2 的值较小时,能够捕获更多的边缘信息

Laplace算子对通过图像进行操作实现边缘检测的时,对离散点和噪声比较敏感。于是,首先对图像进行高斯卷积滤波进行降噪处理,再采用Laplace算子进行边缘检测,就可以提高算子对噪声和离散点的Robust, 这一个过程中Laplacian of Gaussian(LOG)算子就诞生了。

代码实现

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图像
img = cv2.imread('1.bmp',cv2.IMREAD_GRAYSCALE)
lenna_img = img #cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#灰度化处理图像
grayImage = img #cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#高斯滤波
gaussianBlur = cv2.GaussianBlur(grayImage, (3,3), 0)#阈值处理
#ret, binary = cv2.threshold(gaussianBlur, 150, 255, cv2.THRESH_BINARY)
#自适应阈值处理
binary = cv2.adaptiveThreshold(src=gaussianBlur,maxValue=255,adaptiveMethod=cv2.ADAPTIVE_THRESH_MEAN_C,thresholdType=cv2.THRESH_BINARY,blockSize=11,C=1)  #Roberts算子
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(binary, cv2.CV_16S, kernelx)
y = cv2.filter2D(binary, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#Prewitt算子
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]], dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]], dtype=int)
x = cv2.filter2D(binary, cv2.CV_16S, kernelx)
y = cv2.filter2D(binary, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX,0.5,absY,0.5,0)#Sobel算子
x = cv2.Sobel(binary, cv2.CV_16S, 1, 0)
y = cv2.Sobel(binary, cv2.CV_16S, 0, 1)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#拉普拉斯算法
dst = cv2.Laplacian(binary, cv2.CV_16S, ksize = 3)
Laplacian = cv2.convertScaleAbs(dst)# Scharr算子
x = cv2.Scharr(gaussianBlur, cv2.CV_32F, 1, 0) #X方向
y = cv2.Scharr(gaussianBlur, cv2.CV_32F, 0, 1) #Y方向
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Scharr = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)#Canny算子
Canny = cv2.Canny(gaussianBlur, 20, 30)#先通过高斯滤波降噪
gaussian = cv2.GaussianBlur(grayImage, (3,3), 0)#再通过拉普拉斯算子做边缘检测
dst = cv2.Laplacian(gaussian, cv2.CV_16S, ksize = 3)
LOG = cv2.convertScaleAbs(dst)#效果图
fig = plt.figure(figsize=(10, 10))#设置大小
titles = ['Source Image', 'Binary Image', 'Roberts Image','Prewitt Image','Sobel Image', 'Laplacian Image','Scharr Image', 'Canny Image', 'LOG Image']
images = [lenna_img, binary, Roberts,Prewitt, Sobel, Laplacian,Scharr, Canny, LOG]
for i in np.arange(9):  plt.subplot(3,3,i+1),plt.imshow(images[i],'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()
fig.savefig('fig-sharp.jpg',bbox_inches='tight')

效果展示

CSDN话题挑战赛第2期
参赛话题:学习笔记

Python图像锐化及边缘检测(Roberts、Prewitt、Sobel、Lapllacian、Canny、LOG)相关推荐

  1. Python中的图像处理(第十一章)Python图像锐化及边缘检测(1)

    Python中的图像处理(第十一章)Python图像锐化及边缘检测(1) 前言 一. Python准备 二. Python仿真 三. 小结 前言 随着人工智能研究的不断兴起,Python的应用也在不断 ...

  2. [Python图像处理] 四十二.Python图像锐化及边缘检测万字详解(Roberts、Prewitt、Sobel、Laplacian、Canny、LOG)

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

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

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

  4. 图像分割-基本边缘检测roberts,prewitt,sobel,canny,laplace

    执行边缘检测的三个基本步骤: 1.为降噪对图像进行平滑处理.(导数对噪声具有敏感性.图像的正负分量检测困难) 2.边缘点的检测.(提取边缘点的潜在候选者) 3.边缘定位.(从候选者中选出真是边缘点成员 ...

  5. 图像算法八:【图像分割】边缘检测(Roberts,Sobel,canny)、霍夫变换(hough)、阈值分割、区域分割

    1.我们主要学习以下四种差分算子 Roberts算子 Sobel算子 Prewitt算子 canny算子 % Matlab图像边缘检测梯度算子–Roberts.Prewitt.Sobel.LOG.Ca ...

  6. Python 计算机视觉(十)—— OpenCV 图像锐化及边缘检测

    参考的一些文章以及论文我都会给大家分享出来 -- 链接就贴在原文,论文我上传到资源中去,大家可以免费下载学习,如果当天资源区找不到论文,那就等等,可能正在审核,审核完后就可以下载了.大家一起学习,一起 ...

  7. python图像锐化 增强边缘_[Python图像处理]十一.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子,Schar算子...

    Roberts算子 Roberts算子即为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条.常用来处理具有陡峭的第噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更 ...

  8. python图像锐化_Python图像处理介绍--图像模糊与锐化

    欢迎关注 "小白玩转Python",发现更多 "有趣" 引言 在之前的文章中,我们讨论了边缘检测内核.在本文我们将讨论如何在图像上应用模糊与锐化内核,将这些内核 ...

  9. python图像锐化,图像加强、锐化,利用 Python-OpenCV 来实现 4 种方法!

    图像加强目的使得模糊图片变得更加清晰.图片模糊的缘由是由于像素灰度差值变化不大,图片各区域产生视觉效果彷佛都是同样的, 没有较为突出的地方,看起来不清晰的感受web 解决这个问题的最直接简单办法,放大 ...

最新文章

  1. 金额阿拉伯数字转换为中文大写
  2. winsock2之最简单的win socket编程
  3. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能
  4. CollaDec 之前的三个SharePoint工具开源发布
  5. linux怎么开ssh端口,如何查看linux中的ssh端口开启状态
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1052:计算邮资
  7. git commit查找提交的关键字
  8. python3字节转化字符_捋一捋字符串与字节序列的关系
  9. 互联网晚报 | 12月23日 星期四 | 芒果TV将上调会员价格;小红书宣布月活达2亿;荣耀首款折叠旗舰荣耀MagicV官宣...
  10. Qt控件中的属性sizePolicy说明
  11. 利用VBA在EXCLE2010和2007中找回2003式的经典菜单和工具栏
  12. linux删除指定大小的文件,Linux 脚本删除大于指定大小的文件
  13. 获取Linux服务器信息脚本
  14. 模拟https类型的get,post请求时,碰到证书不信任,无法正常获取返回内容的异常
  15. java 车牌号正则_最新车牌号码(包括新能源车牌)正则表达式
  16. 《ShowYou数组代码》第38题:对数组元素进行排序
  17. JAVA类似ABP框架_【Net】ABP框架学习之它并不那么好用
  18. 盘点PC端超好用的文字转语音工具,赶紧收藏起来
  19. 这3款在线PS工具,得试试
  20. ROS多设备组网(WSL+miniPC+Nv Orin)

热门文章

  1. 百度地图绘制工具类 DrawingManager.js 源码
  2. 信息奥赛一本通1225:金银岛
  3. unity弹幕功能实现
  4. 通过rvm 安装 ruby
  5. Axon Framework官方文档(五)
  6. 瑞萨E1/E20烧录工具自检方法
  7. 前端学习路线(简洁清晰,直击学习途径)
  8. 计算平均值和标准方差。
  9. 机械转行前端,半年零基础自学的心路历程
  10. python快速入门编程第5章编程题