OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效,由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。本文主要介绍Python 中使用cv2(Opencv) 进行图像运算方法及示例代码。

1、开运算

先进行腐蚀再进行膨胀就叫做开运算。图像被腐蚀后,去除了噪声,但会压缩图像;对腐蚀过的图像进行膨胀处理,可以去除噪声并保持原有形状。

代码如下,

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img = cv2.imread('cjavapy.png')

# 开:先腐蚀,再膨胀
kernel = np.ones((5,5),np.uint8) 
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

cv2.imshow('opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、闭运算

先进行膨胀再进行腐蚀就叫做开运算。它有助于关闭前景物体内部的小孔,或物体上的小黑点。

代码如下,

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img = cv2.imread('cjavapy.png')

# 闭:先膨胀,再腐蚀
kernel = np.ones((5,5),np.uint8) 
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

cv2.imshow('closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、梯度运算

一张图片分别做膨胀与腐蚀操作,最后用膨胀后的图片减去腐蚀的图片,得到的新图片便是该图片的梯度运算。

梯度运算 (img) = 膨胀 (img) - 腐蚀 (img)

通过梯度运算可以得到前景物体的轮廓。

代码如下,

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img = cv2.imread('cjavapy.png')

# 梯度=膨胀-腐蚀
kernel = np.ones((7,7),np.uint8) 
# 膨胀
dilate = cv2.dilate(pie,kernel,iterations = 5)
# 腐蚀
erosion = cv2.erode(pie,kernel,iterations = 5)
# 运算
res = np.hstack((dilate,erosion))

cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
# morphologyEx() 实现开运算
# src:需要处理的图像
# cv2.MORPH_GRADIENT:指定为梯度运算
# kernel:卷积核,为元组,一般使用 numpy 进行赋值
gradient = cv2.morphologyEx(pie, cv2.MORPH_GRADIENT, kernel)

cv2.imshow('gradient', gradient)
cv2.waitKey(0)
cv2.destroyAllWindows()

4、顶帽运算(礼帽)

取出亮度高的地方

顶帽运算 = 原图像 - 开运算

开运算可以消除暗背景下的高亮区域,如果用原图减去开运算结果,就可以得到原图中灰度较亮的区域,所以又称白顶帽变换。

代码如下,

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img = cv2.imread('cjavapy.png')

tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、底帽运算(黑帽)

取出亮度低的地方

底帽运算 = 原图像 - 闭运算

闭运算可以删除亮背景下的暗区域,那么用原图减去闭运算结果就可以得到原图像中灰度较暗的区域,所以又称黑底帽变换。

代码如下,

import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
img = cv2.imread('cjavapy.png')
blackhat  = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat ', blackhat )
cv2.waitKey(0)
cv2.destroyAllWindows()

推荐文档