程序及注释:
import cv2 as cv
import numpy as np
# 读取图片
n = cv.imread("lena.jpg")
cv.namedWindow("input",cv.WINDOW_AUTOSIZE)
cv.imshow("input",n)
cv.waitKey(0)
# 转换为灰度
gray = cv.cvtColor(n,cv.COLOR_BGR2GRAY) # 颜色转化 BGR到GRAY
cv.imshow("gray",gray)
cv.waitKey(0)
print(n.shape)
print(gray.shape)
# 创建空白图像
black = np.zeros_like(n) # 创建0矩阵
cv.imshow("black",black)
cv.waitKey(0)
# 调节亮度
black[:,:,:] =50 # 整体赋值为50
print(black)
lighter =cv.add(n,black) # 加操作
darker = cv.subtract(n,black) # 减操作
cv.imshow("lightness",lighter)
cv.waitKey(0)
cv.imshow("darkness",darker)
cv.waitKey(0)
# 调节对比度
dst = cv.addWeighted(n,1.2,black,0.0,0) # 图像混合的函数用于调节对比度??
cv.imshow("contrast",dst)
cv.waitKey(0)
# 放大缩小图像
h,w,c = n.shape
dst = cv.resize(n,(h//2,w//2)) # 除法有两种/和//
cv.imshow("resize_image",dst)
cv.waitKey(0)
# 翻转
# 水平翻转
dst = cv.flip(n,1) # flip(翻转对象,翻转方式)
cv.imshow("flip",dst)
cv.waitKey(0)
# 上下翻转
dst = cv.flip(n,0)
cv.imshow("flip0",dst)
cv.waitKey(0)
# 旋转 图像的旋转支持,基于放射变换,M = 2x3的变换矩阵
M= cv.getRotationMatrix2D((w//2,h//2),45,1)
dst =cv.warpAffine(n,M,(w,h))
cv.imshow("rotate",dst)
cv.waitKey(0)
# 色彩变换
# HSV
hsv = cv.cvtColor(n,cv.COLOR_BGR2HSV)
cv.imshow("hsv",hsv)
cv.waitKey(0)
#色彩表 - 支持14中色彩变换
dst = cv.applyColorMap(n,cv.COLORMAP_AUTUMN)
cv.imshow("color table",dst)
cv.waitKey(0)
# 模糊
blur = cv.blur(n, (15, 15)) #图像卷积模糊操作,卷积核大小为15x15
cv.imshow("blur", blur)
cv.waitKey(0)
# 高斯模糊 图像高斯模糊操作,sigma = 15
gblur = cv.GaussianBlur(n, (0, 0), 15)
cv.imshow("gaussian blur", gblur)
cv.waitKey(0)
# 自定义滤波器 图像自定义滤波操作,定义不同的滤波器,得到不同的滤波效果,这里是均值滤波,模糊操作。
k = np.ones(shape=[5, 5], dtype=np.float32) / 25
dst = cv.filter2D(n, -1, k) # filter2D(原图像,目标图像所需的深度,卷积核)
cv.imshow("custom blur", dst)
cv.waitKey(0)
# 高斯双边模糊 边缘保留滤波算法的一种,OpenCV还支持其它的边缘保留滤波算法。
dst = cv.bilateralFilter(n, 0, 100, 10)
cv.imshow("bi-filter", dst)
cv.waitKey(0)
# 图像梯度 图像梯度提取,基于一阶导数算子Sobel
dx = cv.Sobel(n, cv.CV_32F, 1, 0)
dy = cv.Sobel(n, cv.CV_32F, 0, 1)
dx = cv.convertScaleAbs(dx)
dy = cv.convertScaleAbs(dy)
cv.imshow("grad-x", dx)
cv.waitKey(0)
cv.imshow("grad-y", dy)
cv.waitKey(0)
# 边缘检测 图像边缘提取,Canny是经典的图像边缘提取算法。100表示低阈值,300表示高阈值。
edge = cv.Canny(n, 100, 300)
cv.imshow("edge", edge)
cv.waitKey(0)
# 直方图均衡化
# 图像直方图均衡化,是图像直方图应用之一,其它还有直方图匹配,直方图相似度,直方图反向投影等。
# 这里的均衡化是全局均衡化,对应还有局部自适应的直方图均衡化方法。
eh = cv.equalizeHist(gray)
cv.imshow("eh", eh)
cv.waitKey(0)
# 角点检测 基于shi-tomas角点检测算法
corners = cv.goodFeaturesToTrack(gray, 100, 0.05, 10)
# print(len(corners))
for pt in corners:
# print(pt)
b = np.random.random_integers(0, 256)
g = np.random.random_integers(0, 256)
r = np.random.random_integers(0, 256)
x = np.int32(pt[0][0])
y = np.int32(pt[0][1])
cv.circle(n, (x, y), 5, (int(b), int(g), int(r)), 2)
cv.imshow("corners detection", n)
cv.waitKey(0)
# 二值化加载图像
src = cv.imread("case3.jpg")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imshow("binary input", gray)
cv.waitKey(0)
# 固定阈值 手动指定阈值为127,THRESH_BINARY表示大于127为白色,反之为黑色。
ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
cv.imshow("binary", binary)
cv.waitKey(0)
# 全局阈值 自动计算阈值,基于全局直方图信息
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("otsu", binary)
cv.waitKey(0)
# 自适应阈值 自适应阈值计算方法,支持高斯与盒子两种方式。
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 25, 10)
cv.imshow("ada", binary)
cv.waitKey(0)
# 轮廓分析 二值图像的轮廓与结构分析API,演示,这里只是获取了最外层轮廓。
# gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
# ret, binary = cv.threshold(gray,127,255,cv.THRESH_BINARY) #如果图像是二值图,这一行就可以删除
# contours, hierarchy = cv.findContours(binary,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)
# cv.drawContours(src,contours,-1,(0,0,255),3)
# cv.imshow("img", src)
# cv.waitKey(0)
# 膨胀与腐蚀操作
se = cv.getStructuringElement(cv.MORPH_RECT, (5, 5), (-1, -1))
d = cv.dilate(binary, se)
e = cv.erode(binary, se)
cv.imshow("dilate", d)
cv.waitKey(0)
cv.imshow("erode", e)
cv.waitKey(0)
# 开闭操作
op = cv.morphologyEx(binary, cv.MORPH_OPEN, se)
cl = cv.morphologyEx(binary, cv.MORPH_CLOSE, se)
cv.imshow("open", op)
cv.waitKey(0)
cv.imshow("close", cl)
cv.waitKey(0)