Python+opencv学习记录22:开闭操作

文章目录

  • 1.开闭操作原理
    • 1.1开操作
    • 1.2闭操作
  • 2.开闭操作的应用
    • 2.1开操作
    • 2.2闭操作
  • 3.提取物体特征
  • 完整代码

1.开闭操作原理

图像处理中的开闭运算是两个很重要的形态学操作,它们两个从基本的腐蚀与膨胀操作演变而来的,这些操作主要应用在二值图像的处理上,灰度图像也可以。

1.1开操作

开操作是先腐蚀,后膨胀,作用是用来消除小物体和噪点、平滑较大物体的边界的同时并不明显改变其面积,提取水平或竖直的线。

1.2闭操作

闭操作是显膨胀,后腐蚀,作用是用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积

2.开闭操作的应用

2.1开操作

其代码为:

def open_demo(image):           # 开操作
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 用大律法、全局自适应阈值方法进行图像二值化
    cv.imshow("binary_image", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))  # 获取结构元素
    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)       # 开操作
    cv.imshow("open_result", dst)

原图为:
Python+opencv学习记录22:开闭操作_第1张图片
可以看出原图像中有一些白色的噪点,结果开操作后:
Python+opencv学习记录22:开闭操作_第2张图片
由上图可以看出,小的白色噪点被消除了。

2.2闭操作

其代码为:

def close_demo(image):          # 闭操作
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary_image", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
    cv.imshow("close_result", dst)

原图为:
Python+opencv学习记录22:开闭操作_第3张图片
图中有很多小黑点,此时我们可以通过闭操作,将其黑色的噪声点给填充掉:
Python+opencv学习记录22:开闭操作_第4张图片

3.提取物体特征

开闭操作还可以被用于提取物体的一些特征,如提取图像中的横线,
其代码如下:

def open_demo(image):           # 开操作
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) # 用大律法、全局自适应阈值方法进行图像二值化
    cv.imshow("binary_image", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (15, 1))  # 获取结构元素
    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)       # 开操作
    cv.imshow("open_result", dst)

获取结构元素时,我们可以改变内核大小来达到目的。
原图为:
Python+opencv学习记录22:开闭操作_第5张图片
经过相应的操作后:
Python+opencv学习记录22:开闭操作_第6张图片
除此之外,我们还可以利用开操作来提取图像中的字母,
原图为:
Python+opencv学习记录22:开闭操作_第7张图片
我们可以改变结构元素的内核大小,改为(3,3),得到的结果为:
Python+opencv学习记录22:开闭操作_第8张图片

完整代码

import cv2 as cv                # 导入opencv模块
import numpy as np              # 导入数学函数库


def open_demo(image):           # 开操作
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) # 用大律法、全局自适应阈值方法进行图像二值化
    cv.imshow("binary_image", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))  # 获取结构元素
    dst = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)       # 开操作
    cv.imshow("open_result", dst)


def close_demo(image):          # 闭操作
    print(image.shape)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary_image", binary)
    kernel = cv.getStructuringElement(cv.MORPH_RECT, (3, 3))
    dst = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel)
    cv.imshow("close_result", dst)


print("------------hello python!------------")

src = cv.imread("D:/opencv3/image/chars.png")
cv.namedWindow("input_image", cv.WINDOW_AUTOSIZE)
cv.imshow("input_image", src)
open_demo(src)
# close_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()          # 释放所有窗口

你可能感兴趣的:(Python+opencv学习,python,opencv,计算机视觉)