python数字图像处理基础(四)——图像平滑处理、形态学操作、图像梯度

这篇具有很好参考价值的文章主要介绍了python数字图像处理基础(四)——图像平滑处理、形态学操作、图像梯度。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像平滑处理(滤波操作)

让有噪音点(图像上显得突兀的像素点)的图像变得更加自然顺眼

1.均值滤波 blur()

根据核的大小(rowcol),每个像素值就等于以此像素为中心的周围rowcol个像素的平均值。
核大一点,显然越平滑、模糊。

result = cv2.blur(img, (15, 15))

2.方框滤波 boxFilter()

normalize=true的时候,效果同均值滤波;normalize=false的时候,α=1,仅求和。

result1 = cv2.boxFilter(img, -1, (3,3), normalize=0)

result2 = cv2.boxFilter(img, -1, (6,6), normalize=1)

3.高斯滤波GaussianBlur()

原理为高斯分布(正态分布)
与均值滤波对比,其实还是利用周围的元素,不过周围每个元素的权重不同。
核宽度和高度必须是奇数。
让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。

result = cv2.GaussianBlur(img, (15, 15), 0)

注:(15, 15)表示高斯滤波器的长和宽,0表示滤波器的标准差

4.中值滤波medianBlur()

非常适用于有椒盐点的图像
依据核大小,选取以某个像素为中心的那些像素的中位数作为本像素的值。
本滤波,核宽度核高度是相同的,只需要指明边长。

result = cv2.medianBlur(img, 3)


形态学操作morphology

使用卷积核

1.腐蚀操作

cv2.erode(img,kernel,iterations)

就像土壤侵蚀一样,这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。
卷积核沿着图像滑动,如果与卷积核对应的原图像的所有像素值都是1,
那么中心元素就保持原来的像素值,否则就变为零。

  • 作用:去除白噪声、断开两个连在一块的物体…
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)  
erosion = cv2.erode(img,kernel,iterations = 1)

其中,

  • img 指需要腐蚀的图
  • kernel 指腐蚀操作的内核,默认是一个简单的3X3矩阵,
    我们也可以利用getStructuringElement()函数指明它的形状
  • iterations 指的是腐蚀次数,省略是默认为1
2.膨胀操作
cv2.dilate(img,kernel,iterations)
dilation = cv2.dilate(img,kernel,iterations = 1)

与腐蚀相反,与卷积核对应的原图像的像素值中只要有一个是1,中心元素的像素值就是1。
可以弥补腐蚀操作后的结果(填充被腐蚀的部分、连接两个被分开的物体…)

腐蚀是我们将“腐蚀”边缘。 它的工作方式是使用滑块(核)。
我们让滑块滑动,如果所有的像素是白色的,那么我们得到白色,否则是黑色。 这可能有助于消除一些白色噪音。
另一个版本是膨胀,它基本上是相反的:让滑块滑动,如果整个区域不是黑色的,就会转换成白色。

3.开运算 cv2.morphologyEx()

先进性腐蚀再进行膨胀就叫做开运算。它被用来去除噪声。

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

4.闭运算 cv2.morphologyEx()

先膨胀再腐蚀。它经常被用来填充前景物体中的小洞,或者前景物体上的小黑点。

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

5.梯度运算

梯度 = 膨胀后的图像 - 腐蚀后的图像

gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

6.礼帽与黑帽

礼帽 = 原始输入 - 开运算结果

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

黑帽 = 闭运算结果 - 原始输入

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

计算图像梯度

梯度

图像函数f(x,y)在点(x,y)的梯度是一个具有大小和方向的矢量,梯度的方向是函数f(x,y)变化最快的方向,当图像中存在边缘时,一定有较大的梯度值,相反,当图像中有比较平滑的部分时,灰度值变化较小,则相应的梯度也较小,图像处理中把梯度的模简称为梯度。

简单理解,一个图像是一个函数,梯度就是灰度值的变化率

图像的梯度是多少?哪些地方有梯度、找出来。
相当于边缘检测(在图像中物体的边缘像素点才有明显的数值变化,即梯度)

1.Sobel算子

从右到左,从下到上
右边减左边,下边减上边
得到边缘

dst = cv2.Sobel(src, ddepth, dx, dy, ksize)

其中,

  • ddepth 图像的深度,通常为-1,或cv2.CV_64F表示负数
  • dx、dy 表示水平和竖直方向
  • ksize 是Sobel算子的大小,通常用33或55

注:cv2会默认进行截断,即像素点数值范围为0-255,小于0的全为0,大于255为255
白到黑是正数,黑到白就是负数了,所有的负数会被截断,为0,即都是黑的
故为了左右两侧边缘都能显示,需要加上绝对值cv2.convertScaleAbs(),即

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobelx = cv2.convertScaleAbs(sobely)

以上为求Gx,即dx=1,dy=0,下面求Gy

sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
sobely = cv2.convertScaleAbs(sobely)

分别计算x和y,再求和

sobleXY = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)

注:两个0.5是两个图像的比例权重,最后的0是偏置项,一般为0

以上为一般步骤,即x、y分开算再求和。若直接dx=1,dy=1一次算的话,效果不好。

2.Scharr算子

scharrx = cv2.Scharr(img,cv2.CV_64F, 1, 0)
scharry = cv2.Scharr(img,cv2.CV_64F, 0, 1)
scharrx = cv2.convertScaleAbs(scharrx)
scharry = cv2.convertScaleAbs(scharry)
scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5)

其中,

  • scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0): 这一行对输入图像 img 沿着x轴应用Scharr算子。Scharr算子是一种用于边缘检测的卷积滤波器。
  • scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1): 这一行对输入图像 img 沿着y轴应用Scharr算子。
  • scharrx = cv2.convertScaleAbs(scharrx): 将 scharrx 转换为无符号整数类型。这是因为Scharr算子的计算结果可能包含负值,而转换为无符号整数可以保留正数部分。
  • scharry = cv2.convertScaleAbs(scharry): 将 scharry 转换为无符号整数类型。
  • scharrxy = cv.addWeighted(scharrx, 0.5, scharry, 0.5): 使用 cv.addWeighted 函数将经过Scharr算子处理的x方向和y方向的图像叠加起来,创建一个新的图像 scharrxy。这里权重分别为0.5,表示对两个方向的处理结果进行平均。

3.laplacian算子

对像素点数值变化更敏感,也就意味着对图像上的噪音点敏感,容易认为是边缘。
单独使用效果不好。

Laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)
  • scharr最深刻,然后soble,laplacian最浅。算子的核不同。

  • 这里举一个简单的例子:
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 读取图像
img = cv2.imread('./image/car1.jpg', cv2.IMREAD_GRAYSCALE)

# 进行形态学膨胀操作
kernel = np.ones((5,5), np.uint8)  # 5x5 的卷积核
dilation = cv2.dilate(img, kernel, iterations=1)

# 进行形态学腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)

# 显示原始图像、膨胀和腐蚀的结果
plt.subplot(131), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(132), plt.imshow(dilation, cmap='gray'), plt.title('Dilation')
plt.subplot(133), plt.imshow(erosion, cmap='gray'), plt.title('Erosion')
plt.show()

# 进行边缘检测(使用Sobel算子)
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
edges = cv2.magnitude(sobelx, sobely)

# 显示边缘检测结果
plt.subplot(121), plt.imshow(img, cmap='gray'), plt.title('Original Image')
plt.subplot(122), plt.imshow(edges, cmap='gray'), plt.title('Edge Detection (Sobel)')
plt.show()

结果如下:

python数字图像处理基础(四)——图像平滑处理、形态学操作、图像梯度,数字图像处理,python,计算机视觉,opencv
python数字图像处理基础(四)——图像平滑处理、形态学操作、图像梯度,数字图像处理,python,计算机视觉,opencv文章来源地址https://www.toymoban.com/news/detail-800643.html


到了这里,关于python数字图像处理基础(四)——图像平滑处理、形态学操作、图像梯度的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字图像处理|图像的平滑和锐化

      彩色图像平滑是一种常见的图像处理技术,旨在减少图像中的噪声和细节,使图像更加平滑和连续。在彩色图像中每个像素由红、绿、蓝三个通道的值组成,因此彩色图像平滑需要对每个通道分别进行处理。常用的彩色图像平滑方法包括均值滤波、高斯滤波、中值滤波等。

    2024年02月08日
    浏览(45)
  • 数字图像处理 - 形态学算法 - 颗粒划分 - 冈萨雷斯第三版 - 9.36

    形态学算法 - 颗粒分割 项目地址:https://github.com/LetMeFly666/MorphologicalAlgorithm_ParticleSegmentation 在线文档: https://maps.letmefly.xyz 显微应用中一个预处理步骤是从两组或更多组重叠的类似颗粒(见右图)中分离出单个独立的一种颗粒。假设所有颗粒的大小相同,提出一种产生3幅图

    2024年02月04日
    浏览(71)
  • 图像处理基础篇-形态学处理-边缘检测(matlab仿真与图像处理系列第4期)

    图像处理方面的老师,第一天学习以下内容和代码: 图像读取和显示:在Matlab中,可以使用imread函数读取图像,并使用imshow函数显示图像。以下是一个简单的示例代码: 图像滤波:滤波是图像处理中常用的一种技术,可以用来去除噪声、平滑图像等。以下是一些常见的滤波

    2024年02月11日
    浏览(47)
  • 【C++】【图像处理】形态学处理(腐蚀、膨胀)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)

        总结 针对处理二值图图像时,腐蚀或膨胀算法的核心: 1、确定该点(假设为A点)的灰度级,是0还是255; 2、遍历以该点为中心的3x3的邻域,获取灰度级等于0或者等于255的像素点个数,使用 flag 变量记录; 3、当 flag 大于设定的数值时,则A点的灰度级将被赋值为0或者

    2024年02月05日
    浏览(58)
  • 简要介绍 | 基于Python的图像形态学处理概述

    注1:本文系“简要介绍”系列之一,仅从概念上对基于Python的图像形态学处理进行非常简要的介绍,不适合用于深入和详细的了解。 Digital terrain models from airborne laser scanning for the automatic extraction of natural and anthropogenic linear structures In: Geomorphological Mapping: a professional handbook of

    2024年02月10日
    浏览(44)
  • OpenCV(图像处理)-基于Python-形态学处理-开运算、闭运算、顶帽、黑帽运算

    OpenCV形态学是一种基于OpenCV库的数字图像处理技术,主要用于处理图像的形状、结构和空间关系。它包括一系列图像处理工具和算法,包括膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽等。 通过对图像进行形态学操作可以实现一些重要的图像处理任务,比如去除噪

    2024年02月09日
    浏览(56)
  • Python-OpenCV中的图像处理-形态学转换

    形态学操作:腐蚀,膨胀,开运算,闭运算,形态学梯度,礼帽,黑帽等 主要涉及函数:cv2.erode(), cv2.dilate(), cv2.morphologyEx() 原理:形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化

    2024年02月13日
    浏览(59)
  • python数字图像处理基础(十)——背景建模

    背景建模是计算机视觉和图像处理中的一项关键技术,用于提取视频中的前景对象。在视频监控、运动检测和行为分析等领域中,背景建模被广泛应用。其基本思想是通过对视频序列中的像素进行建模,找到视频中的静态背景,并将不同的像素标记为背景和前景,从而使后续

    2024年01月19日
    浏览(65)
  • python数字图像处理基础(九)——特征匹配

    蛮力匹配(ORB匹配) Brute-Force匹配非常简单,首先在第一幅图像中选取一个关键点然后依次与第二幅图像的每个关键点进行(描述符)距离测试,最后返回距离最近的关键点. 对于BF匹配器,首先我们必须使用**cv2.BFMatcher()**创建 BFMatcher 对象。它需要两个可选的参数: normTyp

    2024年01月19日
    浏览(54)
  • Python-OpenCV中的图像处理-图像平滑

    使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分(比如:噪音,边界)。所以边界也会被模糊一点。(当然,也有一些模糊技术不会模糊掉边界)。 这是由一个归一化卷积框完成的。他只是用卷积框覆盖区域所有像素的平

    2024年02月13日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包