OpenCV中的形态学8

形态学概述

在这里插入图片描述
开运算:先做腐蚀后做膨胀(腐蚀可以理解为缩小)
闭运算:先膨胀后腐蚀
在这里插入图片描述
在这里插入图片描述

图像全局二值化

低于threshold就置为0,高于threshold就置为255
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//9.jpg')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('gray', img2)
cv2.imshow('bin', dst)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//9.jpg')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY_INV)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('gray', img2)
cv2.imshow('bin', dst)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

img = cv2.imread('E://pic//9.jpg')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, dst = cv2.threshold(img2, 60, 255, cv2.THRESH_BINARY)
ret, dst2 = cv2.threshold(img2, 60, 255, cv2.THRESH_BINARY_INV)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('gray', img2)
cv2.imshow('bin', dst)
cv2.imshow('bin2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

阈值类型

在这里插入图片描述

自适应阈值二值化

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# img = cv2.imread('E://pic//9.jpg')
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('gray', cv2.WINDOW_NORMAL)
cv2.namedWindow('bin', cv2.WINDOW_NORMAL)
cv2.namedWindow('bin2', cv2.WINDOW_NORMAL)
img = cv2.imread('./math.png')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, dst = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY)
ret, dst2 = cv2.threshold(img2, 180, 255, cv2.THRESH_BINARY_INV)
print(dst.shape)

cv2.imshow('img', img)
cv2.imshow('gray', img2)
cv2.imshow('bin', dst)
cv2.imshow('bin2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('gray', cv2.WINDOW_NORMAL)
cv2.namedWindow('bin', cv2.WINDOW_NORMAL)
cv2.namedWindow('bin2', cv2.WINDOW_NORMAL)
img = cv2.imread('./math.png')
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

dst = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 0)
dst2 = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)

cv2.imshow('img', img)
cv2.imshow('gray', img2)
cv2.imshow('bin', dst)
cv2.imshow('bin2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

OpenCV腐蚀

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取形态学卷积核

在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
print(kernel)
dst = cv2.erode(img, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

OpenCV膨胀

原来黑色区域变成白色
在这里插入图片描述
卷积核大小意味着膨胀的速度,卷积核越大膨胀越快
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
dst = cv2.dilate(img, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
print(kernel)
# 腐蚀
dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
dst2 = cv2.dilate(dst, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)
# 腐蚀
dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
dst2 = cv2.dilate(dst, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

开运算

开运算能达到消除噪点的效果
在这里插入图片描述
在这里插入图片描述
对噪点比较大的图像,我们用大的卷积核,消除噪点能力更强
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./dotj.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# print(kernel)
# 腐蚀
dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
dst2 = cv2.dilate(dst, kernel, iterations=1)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./dotj.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

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

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

闭运算

闭运算消除里面的噪点,开运算消除外面的噪点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./dotinj.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

# dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
噪点比较大就要大一点的卷积核
在这里插入图片描述

形态学梯度

可以求边缘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

# 开运算
# dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
# dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

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

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述
因为7x7的kernel太大,腐蚀太多,造成里面的黑线很少

现在我们换成3x3的kernel

# -*- coding: utf-8 -*-
import cv2
import numpy as np

cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./j.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

# 开运算
# dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
# dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

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

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

顶帽运算

获取的是外面的噪点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# cv2.namedWindow('img', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./tophat.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (19, 19))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

# 开运算
# dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
# dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 形态学梯度
# dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

# 顶帽运算
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

黑帽操作

获取图内的噪点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# cv2.namedWindow('img', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst', cv2.WINDOW_NORMAL)
# cv2.namedWindow('dst2', cv2.WINDOW_NORMAL)
img = cv2.imread('./dotinj.png')
# kernel = np.ones((7, 7), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
# print(kernel)
# 腐蚀
# dst = cv2.erode(img, kernel, iterations=1)
# 膨胀
# dst2 = cv2.dilate(dst, kernel, iterations=1)

# 开运算
# dst = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
# 闭运算
# dst = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
# 形态学梯度
# dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)

# 顶帽运算
# dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# 黑帽操作
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

cv2.imshow('img', img)
cv2.imshow('dst', dst)
# cv2.imshow('dst2', dst2)

key = cv2.waitKey(0) & 0xff
if key == ord('q'):
    cv2.destroyAllWindows()

在这里插入图片描述

小结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值