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

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

目录


一、导入需要用的设置

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)

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年3月11日
下一篇 2023年3月11日

相关推荐