图像阈值
# src:输入图,只能输入单通道图像,通常来说为灰度图
# dst: 输出图
# thresh: 阈值
# maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
# type: 二值化操作的类型,包含以下五种类型:cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV,
# cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV
# 返回的第一个参数ret是阈值,第二个参数是处理后的图片
ret, dst = cv2.threshold(src, thresh, maxval, type)
import matplotlib as plt
import cv2
import numpy as np
# 将图片以灰度图的形式读入
img = cv2.imread('D:/python/opencv/data/image/test_videos_2_7.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.THRESH_BINARY 超过阈值部分取maxval(最大值),否则取0
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# cv2.THRESH_BINARY_INV 是cv2.THRESH_BINARY的反转
ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
# cv2.THRESH_TRUNC 大于阈值部分设为阈值,否则不变
ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
# cv2.THRESH_TOZERO 大于阈值部分不改变,否则设为0
ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
# cv2.THRESH_TOZERO_INV 是cv2.THRESH_TOZERO的反转
ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow('BINARY', thresh5)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像平滑处理
均值滤波
# 使用一个(3,3)的各个值为1的矩阵取求平均值
blur = cv2.blur(img, (3, 3))
方框滤波
# -1表示通道数和原img一样,一般都使用-1.
# 使用normalize=True后,进行归一化处理,处理效果和均值滤波一样
box = cv2.boxFilter(img, -1, (3, 3), normalize=True)
cv2.imshow('box', box)
# 使用normalize=False后,没有进行归一化处理,只是将(3,3)
# 中的像素相加,若最后大于255,都当作255处理
box = cv2.boxFilter(img, -1, (3, 3), normalize=False)
cv2.imshow('box', box)
高斯滤波
# (5,5)表示高斯矩阵的长和宽,1表示标准差取1
gaussian = cv2.GaussianBlur(img, (5, 5), 1)
cv2.imshow('gaussian', gaussian)
中值滤波
# 5表示矩阵为(5,5),将取到的25个值排序,取中间值
median = cv2.medianBlur(img, 5)
cv2.imshow('median', median)
小技巧
# 同时展示所有的
# 将所有的图片水平的拼接在一起
# res = np.hstack((blur, box, gaussian, median))
# 将所有的图片竖直的拼接在一起
res = np.vstack((blur, box, gaussian, median))
cv2.imshow('all', res)
形态学
腐蚀操作
# np.ones()表示返回一个全1的数组
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
cv2.imshow('erosion', erosion
对比迭代次数不一样的腐蚀操作
kernel = np.ones((30, 30), np.uint8)
erosion_1 = cv2.erode(img, kernel, iterations=1)
erosion_2 = cv2.erode(img, kernel, iterations=2)
erosion_3 = cv2.erode(img, kernel, iterations=3)
res = np.hstack((erosion_1, erosion_2, erosion_3))
cv2.imshow('res', res)
膨胀操作
kernel = np.ones((5, 5), np.uint8)
erosion = cv2.erode(img, kernel, iterations=1)
dilate = cv2.dilate(erosion, kernel, iterations=1)
cv2.imshow('dilate', dilate)
注:经过腐蚀操作和膨胀操作,可以将图像中的一些毛刺去掉
开运算和闭运算
# 开:先腐蚀,后膨胀
# 开运算可以将毛刺腐蚀掉
kernel = np.ones((5,5), np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow('opening', opening)
# 闭:先膨胀,后腐蚀
# 不仅不能把毛刺腐蚀掉,反而使毛刺变得更大
kernel = np.ones((5,5), np.uint8)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
cv2.imshow('closing', closing)
梯度运算
# 梯度运算:膨胀-腐蚀,得到的是一个轮廓
kernel = np.ones((5,5), np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow('gradient', gradient)
礼帽和黑帽
礼帽:原始输入-开运算结果,即显示毛刺
kernel = np.ones((5,5), np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow('tophat', tophat)
黑帽:闭运算结果-原始输入,即显示轮廓
kernel = np.ones((5,5), np.uint8)
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT, kernel)
cv2.imshow('blackhat', blackhat)
|