|
| 1 | +# -*- coding: utf-8 -*- |
| 2 | + |
| 3 | + |
| 4 | +import cv2 |
| 5 | +import numpy as np |
| 6 | + |
| 7 | +img = cv2.imread('j.png', 0) |
| 8 | +cv2.imshow('j.png', img) |
| 9 | +print(img.shape) |
| 10 | + |
| 11 | +kernel = np.ones((5, 5), np.uint8) |
| 12 | + |
| 13 | +# 开运算:先腐蚀再膨胀就叫做开运算。就像我们上 介绍的 样, 它 用来,去噪声。 |
| 14 | +opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) |
| 15 | + |
| 16 | +cv2.imshow('opening', opening) |
| 17 | +cv2.moveWindow('opening', x=img.shape[1], y=0) |
| 18 | + |
| 19 | +# 闭运算 |
| 20 | +# 先膨胀再腐 。它经常 用来填充前景物体中的小洞 或者前景物体上的小黑点。 |
| 21 | +closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) |
| 22 | +cv2.imshow('closing', closing) |
| 23 | +cv2.moveWindow('closing', x=img.shape[1] * 2, y=0) |
| 24 | + |
| 25 | +# 形态学梯度 |
| 26 | +# 其实就是一幅图像膨胀与腐 的差别。 |
| 27 | +# 结果看上去就像前景物体的 廓。 |
| 28 | +gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) |
| 29 | +cv2.imshow('gradient', gradient) |
| 30 | +cv2.moveWindow('gradient', x=img.shape[1] * 3, y=0) |
| 31 | + |
| 32 | +# 礼帽 |
| 33 | +# 原始图像与 开运算之后得到的图像的差。 |
| 34 | +tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) |
| 35 | +cv2.imshow('tophat', tophat) |
| 36 | +cv2.moveWindow('tophat', x=img.shape[1] * 4, y=0) |
| 37 | + |
| 38 | +# 黑帽 进行闭运算之后得到的图像与原始图像的差 |
| 39 | +blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) |
| 40 | +cv2.imshow('blackhat', blackhat) |
| 41 | +cv2.moveWindow('blackhat', x=img.shape[1] * 5, y=0) |
| 42 | + |
| 43 | +cv2.waitKey(0) |
| 44 | +cv2.destroyAllWindows() |
| 45 | + |
| 46 | +''' |
| 47 | +结构化元素 |
| 48 | +在前 的例子中我们使用 Numpy 构建了结构化元素 它是正方形的。 |
| 49 | +但 有时我们 需要 构建一个椭圆形/圆形的核。 |
| 50 | +为了实现 这种需求 ,提供了 OpenCV 函数 cv2.getStructuringElement()。 |
| 51 | +你只 告诉 他 你需要的核的形状和大小。 |
| 52 | +# Rectangular Kernel |
| 53 | +>>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) |
| 54 | +array([[1, 1, 1, 1, 1], |
| 55 | + [1, 1, 1, 1, 1], |
| 56 | + [1, 1, 1, 1, 1], |
| 57 | + [1, 1, 1, 1, 1], |
| 58 | + [1, 1, 1, 1, 1]], dtype=uint8) |
| 59 | +# Elliptical Kernel |
| 60 | +>>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) |
| 61 | +array([[0, 0, 1, 0, 0], |
| 62 | + [1, 1, 1, 1, 1], |
| 63 | + [1, 1, 1, 1, 1], |
| 64 | + [1, 1, 1, 1, 1], |
| 65 | + [0, 0, 1, 0, 0]], dtype=uint8) |
| 66 | +# Cross-shaped Kernel |
| 67 | +>>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) |
| 68 | +array([[0, 0, 1, 0, 0], |
| 69 | + [0, 0, 1, 0, 0], |
| 70 | + [1, 1, 1, 1, 1], |
| 71 | + [0, 0, 1, 0, 0], |
| 72 | + [0, 0, 1, 0, 0]], dtype=uint8) |
| 73 | +''' |
0 commit comments