图像识别基础代码汇总(python+opencv)

为了方便复制粘贴,汇总一下基础图像处理代码(如有遗漏欢迎指出,后续再添加修改)没有原理讲解,我也是个小白,方便日后写代码直接复制使用做的笔记

目录

一、导入需要用的设置

二、读入、显示、储存、退出图片

1、读入图片

2、图像显示

3、保持图片

4、退出

5、删除窗口

二、获得图像信息

1、图像形状、像素、类型

2、图像RGB值

三、修改图像信息

1、修改像素

2、缩放 resize()

3、旋转 getRotationMatrix2D(), warpAffine()

4、翻转 flip()

5、平移 warpAffine()

三、图像阈值化 threshold()

1、二进制阈值化 cv2.THRESH_BINARY

2、反二进制阈值化 cv2.THRESH_BINARY_INV

3、截断阈值化 cv2.THRESH_TRUNC

4、阈值化为0 cv2.THRESH_TOZERO

5、反阈值化为0 cv2.THRESH_TOZERO_INV 

四、图像滤波

1、均值滤波 cv2.blur(src, ksize)

2、中值滤波 cv2.medianBlur(src, ksize)

3、高斯滤波 cv2.GaussianBlur(src, ksize, sigmaX)

五、形态学处理

1、腐蚀 cv2.erode(src, kernel, iterations)

2、膨胀 cv2.dilate(src, kernel, iterations)

3、开运算 cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

4、闭运算 cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

5、顶帽运算

6、黑帽运算

六、直方图均值化 equalizeHist()

七、频域滤波

1、高通滤波

2、低通滤波

八、图像梯度

1、sobel算子

2、scharr算子

3、laplacian算子

九、边缘检测 canny

十、图像金字塔

1、向下采样

2、向上采样


一、导入需要用的设置

import numpy as np
import matplotlib.pyplot as plt
import cv2

二、读入、显示、储存、退出图片

1、读入图片

img = cv2.imread("图像路径")
  • 读取原图:cv.IMREAD_UNCHANGED
  • 读取原图的灰度图:cv.IMREAD_GRAYSCALE
  • 读取原图的彩图:cv.IMREAD_COLOR
  • 2、图像显示

    cv2.imshow("指定显示图片名称",读取的图片对象)
    

    3、保持图片

    cv2.imwrite(‘保存路径',读取的图片对象)
    

    4、退出

    cv2.waitKey(delay)
  • delay > 0 – 等待 delay 毫秒
  • delay < 0 – 等待键盘单击
  • delay = 0 – 无限等待
  • delay = null – 等待键盘单击
  • 5、删除窗口

    cv2.destroyAllWindows()
    

    二、获得图像信息

    g = cv2.imread(r"路径",图像名称)  # 灰度图像,单通道
    
    i = cv2.imread(r"路径",图像名称)  # BGR图像,三通道
    

    1、图像形状、像素、类型

    print(g.shape) 
    print(i.shape)
    
    print(g.size) 
    print(i.size) 
    
    print(g.dtype) 
    print(i.dtype) 
    

    2、图像RGB值

    px = image[水平方向像素, 竖直方向像素]
    print("R:", image[水平像素, 竖直像素 -1])
    print("G:", image[水平像素, 竖直像素, 1])
    print("B:", image[水平像素, 竖直像素, 0]) 

    R通道,G通道,B通道、红绿蓝三种不同的颜色通道

    三、修改图像信息

    1、修改像素

    image[像素横坐标, 像素纵坐标] = [255, 255, 255]

    2、缩放 resize()

    result = cv2.resize(src, (160,160))
    result = cv2.resize(src, (int(cols * 0.6), int(rows * 1.2)))
    result = cv2.resize(src, None, fx=0.5, fy=0.5)

    src 表示原始图像;

    dsize 表示缩放大小;

    fx和fy 也可以表示缩放大小倍数,他们两个(dsize或fx/fy)设置一个即可实现图像缩放

    3、旋转 getRotationMatrix2D(), warpAffine()

    M = cv2.getRotationMatrix2D((cols/2, rows/2), 30, 1)
    #参数分别为:旋转中心、旋转度数、scale缩放比例
    
    rotated = cv2.warpAffine(src, M, (cols, rows))
    #参数分别为:原始图像、旋转参数 和 原始图像宽高

    4、翻转 flip()

    dst = cv2.flip(src, flipCode)

    src 表示原始图像

    flipCode 表示翻转方向

    5、平移 warpAffine()

    M = np.float32([[1, 0, x], [0, 1, y]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

    三、图像阈值化 threshold()

    1、二进制阈值化 cv2.THRESH_BINARY

    ret,thresh1=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)

    像素灰度值>thresh,设为最大灰度值

    像素灰度值<thresh,设为0

    2、反二进制阈值化 cv2.THRESH_BINARY_INV

    ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV)

    与二进制阈值化相反,>thresh,设为0

                                       <thresh,设为255

    3、截断阈值化 cv2.THRESH_TRUNC

    ret,thresh3=cv2.threshold(GrayImage,127,255,cv2.THRESH_TRUNC)

    像素灰度值>thresh,设为thresh

    像素灰度值<thresh,不变

    4、阈值化为0 cv2.THRESH_TOZERO

    ret,thresh4=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO)

    >thresh,不变

    <thresh,设为0

    5、反阈值化为0 cv2.THRESH_TOZERO_INV 

    ret,thresh5=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO_INV)
    

    与阈值化为0正相反, >thresh,设为0

                                        <thresh,不变

    四、图像滤波

    1、均值滤波 cv2.blur(src, ksize)

    result = cv2.blur(src, ksize)
  • 随着核大小逐渐变大,会让图像变得更加模糊
  • 如果设置为核大小为(1,1),则结果就是原始图像。
  • 2、中值滤波 cv2.medianBlur(src, ksize)

    result = cv2.medianBlur(src, ksize) 
  • 随着核大小逐渐变大,会让图像变得更加模糊;
  • 核必须是大于1的奇数,如3、5、7等;
  • 在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如3、5、7等,对比均值滤波函数用法。
  • 3、高斯滤波 cv2.GaussianBlur(src, ksize, sigmaX)

    result = cv2.GaussianBlur(source, (3, 3), 0)

    五、形态学处理

    设置卷积核

    用numpy生成

    kernel = np.ones((3,3), np.uint8)
    

    用opencv自带函数–getStructuringElement

    element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))   #十字型
    
    element = cv2.getStructuringElement(cv2.MORPH_RECT,(5,5))  #矩形
    
    element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))  #椭圆形

    1、腐蚀 cv2.erode(src, kernel, iterations)

    fushi = cv2.erode(src, kernel)

    2、膨胀 cv2.dilate(src, kernel, iterations)

    pengzhang = cv2.dilate(src, kernel)

    3、开运算 cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

    kai = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel)

    4、闭运算 cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

    bi = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)

    5、顶帽运算

    tophat = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)

    6、黑帽运算

    blackhat = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)

    六、直方图均值化 equalizeHist()

    dst=cv2.equalizeHist(src)
  • dst 表示处理结果
  • src 表示原始图像
  • 七、频域滤波

  • numpy.fft.ifft2(): 实现逆傅里叶变换,返回一个复数数组
  • numpy.fft.ifftshift() :fftshift的逆函数,将低频信息由中心移到左上角
  • iimg = np.abs(逆傅里叶变换的结果) : 将逆傅里叶变换的结果不能直接显示为图像,需要变为灰度值,显示为图像
  • 1、高通滤波

    (1)numpy

    f = np.fft.fft2(img)    #傅里叶变换
    fshift = np.fft.fftshift(f)   #将低频移到中心
    rows,cols = int(rows/2), int(cols/2)  #获取图像中心点
    fshift[crow-30:crow+30, col-30:col+30] = 0  #将中心点周围30区域置为0,即将低频信息去掉,实现高通
                                                #滤波
    ishift = np.fft.ifftshift(fshift)   #将低频移还原到左上角
    iimg = np.fft.ifft2(ishift)   #逆傅里叶变换
    iimg = np.abs(iimg)    #将逆傅里叶变换的结果转换为灰度值,显示为图像
    

    (2)opencv cv2.dft()

    dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)        #傅里叶变换
    dftShift = np.fft.fftshift(dft)                                       #低频移到中心位置
    result = 20*np.log(cv2.magnitude(dftShift[:,:,0], dftShift[:,:,1]))   #转换为灰度值,显示
    

    2、低通滤波

    o = cv2.dft(np.float32(o), flags=cv2.DFT_COMPLEX_OUTPUT)  #傅里叶变换
    dshift = np.fft.fftshift(dft)                             #将低频移到中间
    rs,cs = o.shape                                           #获取图像大小
    cr,cc = int(rs/2), int(cs/2)                              #图像中心
    mask=np.zeros((rs,cs,2),np.int8)                          #构造掩摸图像,两个通道
    mask[cr-30:cr+30, cc-30:cc+30] = 1                        
    md = dshift*mask                                          #消除高频,留着中间部分的低频部分
    imd = np.fft.ifftshift(md)                                #将低频还原到左上角
    io = cv2.idft(imd)                                        #逆傅里叶变换
    io = cv2.magnitude(io[:,:,0], io[:,:,1])                  #转换为灰度值,才能显示为图像
    

    八、图像梯度

    1、sobel算子

    dst = cv2.Sobel(src, ddepth, dx, dy,  [ksize])

    2、scharr算子

    dst = Scharr(src, cv2.CV_64F, dx, dy)
    dst = cv2.convertScaleAbs(dst)

    3、laplacian算子

    
    laplacian = cv2.Laplacian(src, ddepth)
    laplacian = cv2.convertScaleAbs(laplacian)

    九、边缘检测 canny

    edges =  cv2.Canny(image, threshold1, threshold2)
  • image: 原始图像
  • threshold1: 阈值1 minVal
  • threshold2: 阈值2  maxVal
  •  threshold值越小,细节越丰富
  • 十、图像金字塔

    1、向下采样

    r1 = cv2.pyrDown(原图)
    r2 = cv2.pyrDown(r1)
    r3 = cv2.pyrDown(r2)
    

    2、向上采样

    r1 = cv2.pyrUp(原图)
    r2 = cv2.pyrUp(r1)
    r3 = cv2.pyrUp(r2)

    物联沃分享整理
    物联沃-IOTWORD物联网 » 图像识别基础代码汇总(python+opencv)

    发表评论