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);
    
参考资料
原创文章,版权所有,转载请获得作者本人允许并注明出处
我是留白;我是留白;我是留白;(重要的事情说三遍)
posted @ 2021-01-31 21:10  Mojies  阅读(156)  评论(0编辑  收藏  举报