OpenCV学习——形态学操作与图像平滑

# OpenCV学习——形态学操作与图像平滑

    • 形态学操作
      • 连通性
      • 腐蚀和膨胀
      • 开闭运算
      • 礼帽和黑帽
    • 图像平滑
      • 图像噪声
      • 图像平滑
        • 均值滤波
        • 高斯滤波
        • 中值滤波

形态学操作

连通性

前置理解:邻域

4邻域:

OpenCV学习——形态学操作与图像平滑_第1张图片

D邻域:

OpenCV学习——形态学操作与图像平滑_第2张图片

8邻域:
OpenCV学习——形态学操作与图像平滑_第3张图片

连通性:两个像素位置相邻、且灰度值满足特定的相似准则

4连通:

OpenCV学习——形态学操作与图像平滑_第4张图片

8连通:

OpenCV学习——形态学操作与图像平滑_第5张图片

m连通:

  1. q在p的4邻域中,或者

  2. q在p的D邻域中,并且p的4邻域与q的4邻域的交集是空的(即没有灰度值在V集合中的像素点,即和p、q两个像素的灰度值不能一样)

直白解释m连通:以p为基准,q在p的四邻域或者D邻域,然后这两个的四邻域不能有和自己或者和对方相同或者相近的灰度级。

腐蚀和膨胀

腐蚀:原图中的高亮部分被蚕食,效果图拥有比原来更小的高亮区域

操作:用一个结构化元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做”与“操作,全为1则改像素为1,否则为0.

作用:消除物体的边界点,使目标缩小,可以消除小于结构元素的噪声点

cv.erode(img, kernel, iterations)
# img:图片
# kernel:核结构
# iterations:腐蚀次数,默认1

膨胀:使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域。

操作:用一个结构元素扫描图像中的每一个像素,用结构元素中的每一个像素与其覆盖的像素做”与“操作,全为0则改像素为0,否则为1。

作用:将与物体接触的所有背景点合并到物体中,使目标增大,可填补目标中的孔洞。

cv.dilate(img, keral, iterations)
# img:图片
# kernel:核结构
# iterations:膨胀次数,默认1

代码测试:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img = cv.imread('img/15.jpg')

kernel = np.ones((5, 5), np.uint8)

erosion = cv.erode(img, kernel)
dilate = cv.dilate(img, kernel)

cv.imshow("original", img)
cv.imshow('erosion', erosion)
cv.imshow("dilate", dilate)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第6张图片

肯定有人说,你是不是搞反了,不不不,腐蚀的是高亮部分,高亮针对的是灰度级高的,在这个白底的情况下,应该与黑底的相反。

开闭运算

通过将腐蚀和膨胀按照一定的次序进行处理,两者之间的运算的不可逆的,即开运算后的图像不能通过闭运算复原,反之同理。

总结:开运算去除(图像内容)外部干扰,闭运算去除(图像内容)内部干扰

开运算:先腐蚀后膨胀

作用:分离物体、消除小区域

特点:消除噪点、去除小干扰块而不影响原来的图像。

闭运算:先膨胀后腐蚀

作用:消除/闭合物体里的孔洞

特点:填充闭合区域

cv.morphologyEx(img, op, kernel)
# img:图像
# op:处理方式,开-->cv.MORPH_OPEN,闭-->cv.MORPH_CLOSE
# kernel:核结构

代码测试:

import cv2 as cv
import numpy as np

img = cv.imread('img/16.jpg')
img1 = cv.imread('img/17.jpg')

kernel = np.ones((10, 10), np.uint8)

open = cv.morphologyEx(img, cv.MORPH_OPEN, kernel)
close = cv.morphologyEx(img1, cv.MORPH_CLOSE, kernel)

cv.imshow("original1", img)
cv.imshow("original2", img1)
cv.imshow('open', open)
cv.imshow("close", close)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第7张图片
OpenCV学习——形态学操作与图像平滑_第8张图片

礼帽和黑帽

礼帽:原图像与“开运算”结果图之差,取出亮度高的地方

作用:分离比邻近点亮一点的光斑。

黑帽:取出亮度低的地方,原图像与“闭运算”的差

作用:分离比邻近点暗一点的光斑。

cv.morphologyEx(img, op, kernel)
# img:要处理的图像
# op:处理方式
# cv.MORPH_OPEN    开运算
# cv.MORPH_CLOSE   闭运算
# cv.MORPH_TOPHAT  礼帽
# cv.MORPH_BLACKHAT 黑帽
# kernel:内核 

代码测试:

import cv2 as cv
import numpy as np

img = cv.imread('img/16.jpg')
img1 = cv.imread('img/17.jpg')

kernel = np.ones((10, 10), np.uint8)

topath = cv.morphologyEx(img, cv.MORPH_TOPHAT, kernel)
blackhat = cv.morphologyEx(img1, cv.MORPH_BLACKHAT, kernel)

cv.imshow("original1", img)
cv.imshow("original2", img1)
cv.imshow('topath', topath)
cv.imshow("blackhat", blackhat)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第9张图片
OpenCV学习——形态学操作与图像平滑_第10张图片

图像平滑

图像噪声

图像噪声:图像噪声是指存在于图像数据中的不必要的或多余的干扰信息。就是一些没有用的信息遮盖住了我们需要的信息,扰乱图像的可观测信息。

产生原因:图像采集、处理、传输等过程中不可避免的会受到噪声污染。常见的噪声有:椒盐噪声、高斯噪声。

椒盐噪声(脉冲噪声):一种随机出现的白点或黑点。(亮的区域有随机出现的黑色像素,暗的区域有随机出现的白色像素)

成因:影响讯号收到强干扰、类比数位转换器或元传输错误。

高斯噪声:噪声的密度函数服从高斯分布。

图像平滑

去除其中高频信息,保留低频信息

均值滤波

概念:任意一点的像素值,都是周围 N*M 个像素值的均值。

​ 有一个过滤器(矩阵n*m),又成为核,与图像像素进行运算得到对应像素点的结果

优点:简单、计算速度快

缺点:去噪时连同许多细节信息也被去除了

cv.blur(img, ksize, anchor, borderType)
# img:图像
# ksize:卷积核大小
# anchor:默认值(-1,-1),表示核中心
# borderType:边界类型

代码实现:

import cv2 as cv
img = cv.imread('img/18.jpg')
blur = cv.blur(img, (5,5))

cv.imshow("original", img)
cv.imshow("blur", blur)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第11张图片

高斯滤波

高斯滤波:根据二维高斯滤波的概率分布函数图像,以图像的“中心点”作为原点,其他的点按照其在正态曲线上的位置,分配权重,就可以得到一个加权平均值。(还不是很理解,之后学习后会补充)

cv2.GaussianBlur(img, ksize, sigmax, sigmay, boederType)
# img:图像
# ksize:卷积核大小(宽高为奇数,可以不同)
# sigmax:水平方向标准差
# sigmay:垂直方向标准差
# borderType:边界类型

代码实现:

import cv2 as cv

img = cv.imread('img/18.jpg')
gaussianBlur = cv.GaussianBlur(img, (3,3), 1)

cv.imshow("original", img)
cv.imshow("GaussianBlur", gaussianBlur)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第12张图片

中值滤波

中值滤波:非线性滤波技术,利用像素点邻域灰度值的终止来代替该像素点的灰度值,对椒盐噪声有着较好的作用

cv.medianBlur(img, ksize)
# img:图像
# ksize:卷积核大小
import cv2 as cv
img = cv.imread('img/18.jpg')
medianBulr = cv.medianBlur(img, 5)

cv.imshow("original", img)
cv.imshow("medianBulr", medianBulr)
cv.waitKey(0)

OpenCV学习——形态学操作与图像平滑_第13张图片

你可能感兴趣的:(OpenCV,opencv,python)