当前位置: 首页 > news >正文

【OpenCV】11 形态学操作

二值化

将图像的每个像素变成2种值,如0,255

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)# THRESH_BINARY_INV 取反
ret, dst = cv2.threshold(cat_gray, 100, 255, cv2.THRESH_BINARY)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)cv2.waitKey(0)

thresholdType

image

自适应阈值二值化

由于光照不均匀以及阴影的存在,只有一个阈值会使得在阴影处的白色被二值化为黑色。

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)dst = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_gray)
cv2.imshow('dst', dst)cv2.waitKey(0)

腐蚀 erode

image
一般使用全1卷积核
image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)kernel = np.ones((3, 3), np.uint8)
dst = cv2.erode(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

获得形态学卷积核 getStructuringElement

  • MORPH_RECT
  • MORPH_ELLIPSE
  • MORPH_CROSS
import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.erode(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

膨胀 dilate

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)kernel = np.ones((3, 3), np.uint8)
# kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (7, 7))
print(kernel)
dst = cv2.dilate(cat_binary, kernel, iterations=1)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

开运算 = 腐蚀 + 膨胀

消除噪点

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_OPEN, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

闭运算 = 膨胀 + 腐蚀

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_CLOSE, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_gray', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

形态学梯度 = 原图 - 腐蚀

计算边缘

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_GRADIENT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

顶帽运算 = 原图 - 开运算

只保留大块外小噪点

image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_TOPHAT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)

黑帽运算 = 原图 - 闭运算

保留大块中的小噪点
image

import cv2
import numpy as npcat = cv2.imread('img/cat.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_binary = cv2.adaptiveThreshold(cat_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 3, 0)# kernel = np.ones((3, 3), np.uint8)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
print(kernel)dst = cv2.morphologyEx(cat_binary, cv2.MORPH_BLACKHAT, kernel)cv2.imshow('cat', cat)
cv2.imshow('cat_binary', cat_binary)
cv2.imshow('dst', dst)cv2.waitKey(0)
http://www.hskmm.com/?act=detail&tid=14380

相关文章:

  • 安装与使用trex
  • 自建 Supabase 云服务与 BeeCount 云同步详解
  • CF2134 Codeforces Round 1045 (Div. 2) 游记(VP)
  • jemter 安装
  • Day20创建对象内存分析
  • 熬夜三天!SpringCloud Gateway 动态路由失效,背后黑手竟是它……
  • cmd 执行git bash 命令
  • 安全向量模板类SiVector - 实践
  • 最佳三维文件格式,以及怎么在线浏览编辑FBX/OBJ/GLB/GLTF
  • FR报表下拉框高度(JS添加css样式方式)调整
  • 基于Python+Vue开发的新闻管理系统源码+运行步骤
  • 鸿蒙应用开发从入门到实战(十二):ArkUI组件ButtonToggle
  • Spring框架中的注解主要有哪些
  • 从视觉、文案到交互:三步彻底去除产品AI味
  • 理解WPF Stylet中Command={s:Action 方法名}的设计与实现
  • 帆软报表下拉框高度(JS添加css样式方式)调整
  • 探索 12 种 3D 文件格式:综合指南
  • 剑指offer-32、把数组排成最⼩的数
  • WPF 一个Label标签中的文字 Binding两个值
  • Session和Cookie的定义是什么?他们之间有什么区别?
  • 使用C++编写的一款射击五彩敌人的游戏 - 详解
  • CG-65 剖面细管式温度传感器 可实时监测不同土层温度动态
  • list集合根据某字段获取某个对象
  • .NET STS 版本支持 24 个月
  • 后缀数组基础 Suffix Array
  • @Param的作用
  • 后端应该对前端数据来源渠道进行验证
  • 思念比爱更深刻
  • 数据库操作的方法签名
  • 完整教程:第33章 AI在教育领域的应用