Day29-影像侵蚀

上章我们在进行图像轮廓增强的处理时,有用到影像膨胀函数cv2.dilate,但那时候只是稍微带过,读者们可能不太明白cv2.dilate的参数设置。

本来应该补充说明的,但为了方便大家理解,在介绍cv2.dilate之前,我们要先来讲讲和膨胀函数的功能相反的函数cv2.erode

cv2.erode

cv2.erode是一个影像侵蚀函数,光听名字就知道功能和cv2.dilate完全相反。cv2.erode只能用於经过二值化运算的灰阶图片,可起到图片去噪、细化影像和消除毛刺的作用。

而既然需要用到二值化图片,那我们就沿用前两章的程序码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)

img1 = cap.read()[1]
img2 = cap.read()[1]

# 彩色图转灰阶图
gray1 = cv2.cvtColor(t0, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(t1, cv2.COLOR_BGR2GRAY)

# 高斯模糊化处理
blur1 = cv2.GaussianBlur(grey1,(5,5),0)
blur2 = cv2.GaussianBlur(grey2,(5,5),0)

result = cv2.absdiff(blur1, blur2)

# 二值化处理
ret, th = cv2.threshold(result, 15, 255, cv2.THRESH_BINARY)

我们在底下加上一行:

erosion = cv2.erode(th, (3,3), iterations = 1)

cv2.erode的第一个参数为二值化的影像,所以我们直接带入变数th

第二个参数为使用的卷积kernel——影像侵蚀的原理是透过卷积核心沿着图片滚动并计算元素值,如果卷积核心范围内的元素值都是1(即白色),那麽重新赋予的元素值就保持原来的值。反之如果核心范围内的元素值不全为1,重新赋予的元素值为0(即黑色),这表示卷积核心经过的所有像素如果不是全白都会被腐蚀或侵蚀掉(变为0)。

卷积核心的大小通常设定为奇数,如上面程序码设定的3x3,也可以等差设定上去,如5x5、7x7、9x9,核心越大侵蚀的范围也会越大。

第三个参数为迭代次数,通常预设为1,不用特别去动它。

erosion变数印出来看看,会看到轮廓比起原图更加纤细,而且背景的细小毛点被除去了很多!


<<:  Day29 Blender 动画总结

>>:  [DAY 30] 复刻 Rails - View 威力加强版 - 2

微聊 JSON 是什麽呢?

话说我们前几天都在聊 API 怎麽做,今天也来小聊一下做 API 时需要使用到的 JSON JSON...

【第六天 - vim 备份泄漏】

Q1. vim 是什麽? 简单来说, vim 是一种纯文字编辑器,是从 vi 发展出的增强版,而 v...

新增装备 - VSCode 套件介绍

前情提要 身後传来了声音:「哈罗,我叫艾草,是你的入门引导学姊。」 我回头一看却没看到人。 「这里!...

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day24 修改会员密码

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

以Postgresql为主,再聊聊资料库 PostgreSQL复制schema下table结构到另一schema的procedure及取样的研讨

在资料库的日常使用,会有将schema下的table结构复制到另一schema下,供做测试,或是做移...