Python opencv 图像处理
已经封装好的函数库
import cv2 import matplotlib.pyplot as plt import numpy as np import time def imshow(img): plt.imshow(img) plt.axis('off') plt.show() def imread(path): img = cv2.imread(path) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) return img def imsave(path, img): img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) cv2.imwrite(path, img) def laplance(img, level): for i in range(level): d = cv2.pyrDown(img) #imshow(d) dd = cv2.pyrDown(d) #imshow(dd) ddu = cv2.pyrUp(dd) #imshow(ddu) laplance = d - ddu #imshow(laplance) return laplance
基础知识
- 生成全黑图
height = 100 width = 300 img = np.zeros((height,width,3), dtype='uint8')
- 生成全白
height = 100 width = 300 img = np.full((height,width,3), 255, dtype='uint8')
- 剪切
从 300 × 300 的图像截图出 100×100 的图像img = imread('img.jpg') # 假设 img 为 300 × 300 scaleImg = img[100:200, 300::]
- 翻转
# 左右翻转 img2 = cv2.flip(img,1) show(img2) # 上下翻转 img2 = cv2.flip(img,0) show(img2) # 上下 + 左右翻转 img2 = cv2.flip(img,-1) show(img2)
- 旋转
(h,w) = img.shape[:2] (cx,cy) = (w//2, h//2) # 旋转的中心坐标, 旋转角度(+ 逆时针 - 顺时针), 缩放倍数 M = cv2.getRotationMatrix2D((cx,cy),135,0.5) img1 = cv2.warpAffine(img, M, (w,h))
- 移动
img = imread("image.jpg") (w,h,l) = img.shape # [1,0,1000] 代表横向移动 1000 个像素 # [0,1,1000] 代表纵向移动 1000 个像素 shift = np.float32([[1,0,1000],[0,1,1000]]) shifted = cv2.warpAffine(img, shift, (h, w) )
- 绘图
startPoint = (0,0) stopPoint = (100,100) color = (255,0,0) lineWight = 10 # 单位像素 # 画直线 cv2.line(img, startPoint, stopPoint, color, lineWight) # 画矩形框, startPoint, stopPoint 分别为对角线的两个点 cv2.rectangle(img, startPoint, stopPoint, color, lineWight) # 画矩形填充 cv2.rectangle(img, startPoint, stopPoint, color, -1) centerOfCircle = (150, 150) diameter = 100 # 画圆 cv2.circle(img, centerOfCircle, diameter, color, lineWight) # 画圆形填充 cv2.circle(img, centerOfCircle, diameter, color, -1)
- 图像的二值处理
# 以下图像的逻辑运算服从数值逻辑运算中的规律,即 0&0 == 0, 1&0 == 0, 1&1 == 1, 11&01 == 01 .... # bitwise_and - 与 -- # bitwise_or - 或 -- # bitwise_xor - 非 -- # bitwise_not - 异或 -- img = np.zeros((300,300,3),dtype="uint8") white = (255,255,255) img = cv2.rectangle(img, (10,10), (300-10, 300-10), white, 2) imshow(img) img2 = np.zeros((300,300,3),dtype="uint8") white = (255,255,255) img = cv2.circle(img, (150,150), 100, white, -1) imshow(img) img3 = cv2.bitwise_and(img, img2) imshow(img3) img3 = cv2.bitwise_or(img, img2) imshow(img3) img3 = cv2.bitwise_xor(img, img2) imshow(img3) img3 = cv2.bitwise_not(img, img2) imshow(img3)
- 增加减少亮度
imgoffset = np.zeros(img3.shape, dtype='uint8') + 50 # 增加亮度 img4 = cv2.add(img3,imgoffset); # 减少亮度 img4 = cv2.subtract(img3,imgoffset);
- 改变图片大小
scaler = 0.5 newSize = tuple( (np.array(img.shape[:2]) * scaler).astype(int).tolist() ) cv2.resize(img, newSize) # resize 中有一个 interpolation 参数,该参数用于指定 resize 时候使用的插值算法,其数值说明如下: # INTER_NEAREST = 最邻近 # INTER_LINEAR = 线性插值 # INTER_AREA = 基于像素区域 # INTER_CUBIC = 立方差值 # INTER_LANCZOS4 = 兰索斯插值 img3 = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)
- 图像金字塔计算
# 计算高斯金字塔 # 具体实现为从原图中选择 四个方向上的 5 个像素进行高斯加权平均 # 在 opencv 中主要由 cv2.pyrDown() 和 cv2.pyrUp() 来计算得到 # 计算拉普拉斯金字塔 # 为在高斯金字塔的基础上计算而来,计算公式为 Li = Gi - pyrUp(Gi+1) # 求解函数如下: def laplance(img, level): for i in range(level): d = cv2.pyrDown(img) #imshow(d) dd = cv2.pyrDown(d) #imshow(dd) ddu = cv2.pyrUp(dd) #imshow(ddu) laplance = d - ddu #imshow(laplance) return laplance
- 人脸检测
imgoffset = np.zeros(img3.shape, dtype='uint8') + 50 # 增加亮度 img4 = cv2.add(img3,imgoffset); # 减少亮度 img4 = cv2.subtract(img3,imgoffset);
参考资料
![]() |
![]() |
原创文章,版权所有,转载请获得作者本人允许并注明出处
我是留白;我是留白;我是留白;(重要的事情说三遍)