图像的形态学

1 形态学的概率

  图像形态学就是指处理图像的形态特征,本质还是用卷积核来计算提取图像的形状或者特征。
  形态学处理的一般都是黑白像素的图片(像素为0或者255)
常见的形态学处理方式:

  • 膨胀和腐蚀
  • 开运算
  • 闭运算
  • 顶帽
  • 黑帽

2 图像全局二值化

   全局二值化:将每个像素变成0or255
   cv2.threshold(src, thresh, maxval, type):
      src:图片,最好是灰度图
     thresh:阈值,大于某个值怎么样,小于某个值怎么样
      maxval:最大值,不一定是255
      type:操作类型:
        cv2.THRESH_BINARY :超过阈值为max
        cv2.THRESH_BINARY_INV:超过阈值为0
        cv2.THRESH_TOZERO:超过阈值不变,小于变0

import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')

# 对灰度照片进行二值化,先灰度化
gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 二值化,回返回两个值:阈值+处理后的图片
# 阈值越大越黑,合理的调整
thresh, dst = cv2.threshold(gary, 120, 255, cv2.THRESH_BINARY)

cv2.imshow('二值化', np.hstack((gary, dst)))
cv2.waitKey(0)

3 自适应阈值二值化

  使用全局二值化对于图像的某些像素无法得到一个合适的阈值,通过对图片的某一块像素进行自动计算,得到相应的阈值。

  • 参数说明:
       
    cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
  • adaptiveMethod计算阈值的方法:
        -cv2.ADAPTIVE_THRESH_MEAN_C:取相邻区域的平均值
        -cv2.ADAPTIVE_THRESH_GAUSSIAN_C:相邻区域进行一个加权和,高斯窗口
  • blockSize:计算阈值时的邻阈大小
  • C:常数:平均值or加权平均值减去这个常数
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')

# 对灰度照片进行二值化,先灰度化
gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 自适应二值化
dst = cv2.adaptiveThreshold(gary,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,9,0)

cv2.imshow('自适应二值化', np.hstack((gary, dst)))
cv2.waitKey(0)

4 腐蚀操作

   腐蚀操作用卷积核扫描之后,只有覆盖的所有内容为白色才是白色,否则是黑色。

               

K

K

K =

[

1

1

1

1

1

1

1

1

1

]

begin{bmatrix} 1 &1&1 \ 1 & 1& 1 \ 1 & 1& 1 end{bmatrix}

111111111

参数说明:

  • cv2.erode(src,kernel)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')

# 对灰度照片进行二值化,先灰度化
gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 腐蚀操作
kernel = np.zeros((3, 3), np.uint8)
dst = cv2.erode(gary, kernel)

cv2.imshow('腐蚀操作', np.hstack((gary, dst)))
cv2.waitKey(0)

5 形态学卷积核

  上述方法还需要手动调用kernel,使用opencv内置提供的api可以直接获取到卷积核
  cv2.getStructuringElement(shape,ksize)

  • shape是指卷积核的大小,33,55等
  • cv2.MORPH_RECT :卷积核使用数值为1的矩阵
  • cv2.MORPH_ELLIPSE:椭圆
  • cv2.MORPH_CROSS:十字
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#得到卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))

#腐蚀操作
std = cv2.erode(img,kernel)
cv2.imshow('自动获取卷积核',np.hstack((img,std)))

cv2.waitKey(0)

6 膨胀操作

   膨胀操作与腐蚀操作完全相反,
     使像素扩大一圈,变成白色

  • cv2.dilate(scr,kernel)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 膨胀操作
std = cv2.dilate(img, kernel)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

7 开运算

   开运算=腐蚀+膨胀

  • cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel,iterations=2)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 使用开运算:先腐蚀后膨胀
std = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel,iterations=2)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

8 闭运算

   先膨胀后腐蚀
  cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel,iterations=2)
    

import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 使用闭运算:先膨胀后腐蚀。用于去掉内容的噪声
std = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel,iterations=2)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

9 形态学梯度

  • 基本概念:原图减掉腐蚀完之后的图:即得到是图片边缘
  • std = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel,iterations=1)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

# 得到形态学的边缘
std = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel,iterations=1)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

10 顶帽操作

    顶帽 = 原图-开运算
   开运算可以去挑图片之外的噪音
   即:顶帽操作可以得到去掉的噪音

  • std = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 顶帽操作,得到图片外的噪声
std = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel, iterations=1)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

11 黑帽操作

  • 黑帽 = 原图 - 闭运算
  • 闭运算是去掉图片内部的噪声
  • 黑帽得到是图片内部噪声
  • std = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)
import cv2
import numpy as np

img = cv2.imread('imgs/66.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 生成卷积核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))

# 黑帽操作,得到图片内的噪声
std = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel, iterations=1)

# 显示图片
cv2.imshow('膨胀', np.hstack((img, std)))

cv2.waitKey(0)

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>