功能强大的python包(四):OpenCV

1. OpenCV简介
在这里插入图片描述

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上(未来期待在Harmony OS上运行).
它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

2. Opencv模块

模块功能
Core核心模块,包含最基础的操作
Imgproc图像处理模块
Objdectect目标检测模块
Feature2D2D特征检测模块
Video视频处理模块
HighGUI高层图像用户界面
Calib3d3D重建模块
ML机器学习模块
FLANN最近邻搜索模块
Stitching图像拼接模块
Photo计算图像学
Superres超分辨率模块
GPUGPU并行加速模块

3. OpenCV总览

在这里插入图片描述

OpenCV框架中的每一个模块都包含大量的计算机视觉方法,每一个模块都能独当一面,功能强大。

本篇文章将介绍OpenCV库中最重要的模块:Imgproc(图像处理模块)。

在这里插入图片描述

图像处理模块包括:图像的读取、显示、保存;几何运算;灰度变换几何变换平滑、锐化数学形态学阈值分割边缘检测色彩空间;形状绘制等。

  • 图像读取、显示、保存

函数功能
cv2.imread( )图像读取
cv2.imshow( )图像显示
cv2.imwrite( )图像保存
"""图像读取、显示、保存"""

img = cv2.imread('shiyuan.png')
cv2.imwrite('shi.png',img)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


  • 几何运算

函数功能
img1+img2图像加法
cv2.addWeight( )图像融合
"""几何运算"""

img1 = cv2.imread('shiyuan.png')
img2 = cv2.imread('lizi.png')

img3 = cv2.resize(img1,(300,300))+cv2.resize(img2,(300,300))
img4 = cv2.addWeighted(cv2.resize(img1,(300,300)),0.3,cv2.resize(img2,(300,300)),0.7,20)

cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

在这里插入图片描述


  • 灰度变换

函数功能
对数变换变换图像灰度
伽马变换变换图像灰度
直方图均衡化变换图像灰度
直方图规定化变换图像灰度
"""灰度变换"""

import cv2
import copy

img = cv2.imread('bai.png',1)
img1 = cv2.imread('bai.png',0)
img = cv2.resize(img,(400,300))
img1 = cv2.resize(img,(400,300))
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#伽马变换
gamma = copy.deepcopy(gray)
rows = img.shape[0]
cols = img.shape[1]
for i in range(rows):
    for j in range(cols):
        gamma[i][j]=3*pow(gamma[i][j],0.8)

cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('gamma',gamma)

cv2.waitKey(0)
cv2.destroyAllWindows()
"""灰度变换"""

import cv2
import copy
import math

img = cv2.imread('bai.png',1)
img1 = cv2.imread('bai.png',0)
img = cv2.resize(img,(400,300))
img1 = cv2.resize(img,(400,300))
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#对数变换
logc = copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
    for j in range(cols):
        logc[i][j] = 3 * math.log(1 + logc[i][j])
        
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('logc',logc)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

"""灰度变换"""

import cv2
import copy
import math

img = cv2.imread('bai.png',1)
img1 = cv2.imread('bai.png',0)
img = cv2.resize(img,(400,300))
img1 = cv2.resize(img,(400,300))
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 反色变换
cover=copy.deepcopy(gray)
rows=img.shape[0]
cols=img.shape[1]
for i in range(rows):
    for j in range(cols):
        cover[i][j]=255-cover[i][j]

#通过窗口展示图片 第一个参数为窗口名 第二个为读取的图片变量
cv2.imshow('img',img)
cv2.imshow('gray',img1)
cv2.imshow('cover',cover)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

#直方图规定化

import cv2

import numpy as np

import matplotlib.pyplot as plt

img0=cv2.imread('hua.png')#读取原图片

scr=cv2.imread('tu.png')#读取目标图片

#把两张图片转成真正的灰度图片,因为自己只会做灰度图片的规定化

img0=cv2.cvtColor(img0,cv2.COLOR_BGR2GRAY)

img=img0.copy()#用于之后做对比图

scr=cv2.cvtColor(scr,cv2.COLOR_BGR2GRAY)

mHist1=[]

mNum1=[]

inhist1=[]

mHist2=[]

mNum2=[]

inhist2=[]

#对原图像进行均衡化
for i in range(256):

    mHist1.append(0)

row,col=img.shape#获取原图像像素点的宽度和高度



for i in range(row):

    for j in range(col):

        mHist1[img[i,j]]= mHist1[img[i,j]]+1#统计灰度值的个数

mNum1.append(mHist1[0]/img.size)

for i in range(0,255):

    mNum1.append(mNum1[i]+mHist1[i+1]/img.size)

for i in range(256):

    inhist1.append(round(255*mNum1[i]))
    
 #对目标图像进行均衡化

for i in range(256):

    mHist2.append(0)

rows,cols=scr.shape#获取目标图像像素点的宽度和高度

for i in range(rows):

    for j in range(cols):

        mHist2[scr[i,j]]= mHist2[scr[i,j]]+1#统计灰度值的个数

mNum2.append(mHist2[0]/scr.size)

for i in range(0,255):

    mNum2.append(mNum2[i]+mHist2[i+1]/scr.size)

for i in range(256):

    inhist2.append(round(255*mNum2[i]))

在这里插入图片描述


  • 几何变换

函数功能
cv2.resize( )图像缩放
cv2.warpAffine( )图像平移
cv2.getRotationMatrix2D( ) cv2.warpAffine( )图像旋转
cv2.getAffineTransform( ) cv2.warpAffine( )仿射变换
cv2.getPerspectiveTransform( ) cv2.warpPerspective( )透射变换
cv2.pyrUp( )高斯金字塔上采样
cv2.pyrDown( )高斯金字塔下采样
img-cv2.pyrUp(cv2.pyrDown(img))拉普拉斯金字塔
"""几何变换"""

img = cv2.imread('shiyuan.png')

img1 = cv2.resize(img,(300,300))

M = np.float32([[1,0,30],[0,1,60]])
img2 = cv2.warpAffine(img1,M,(300,300))
img2 = cv2.putText(img2,'panning',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

M = cv2.getRotationMatrix2D(((300-1)/2.0,(300-1)/2.0),45,1)
img3 = cv2.warpAffine(img1,M,(300,300))
img3 = cv2.putText(img3,'rotation',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

matr1 = np.float32([[50,50],[200,50],[50,200]])
matr2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(matr1,matr2)
img4 = cv2.warpAffine(img1,M,(300,300))
img4 = cv2.putText(img4,'affine',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

matr1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
matr2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(matr1,matr2)
img5 = cv2.warpPerspective(img1,M,(300,300))
img5 = cv2.putText(img5,'perspective',(20,30),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.imshow('img5',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

"""图像金字塔"""

import cv2 

#高斯金字塔
def pyramid_demo(image):
    level = 2     
    temp = image.copy()  
    pyramid_images = []  
    for i in range(level):
        dst = cv2.pyrDown(temp)   
        pyramid_images.append(dst)  
        cv2.imshow("pyramid"+str(i+1), dst)
        temp = dst.copy()
    return pyramid_images

#拉普拉斯金字塔
def lapalian_demo(image):
    pyramid_images = pyramid_demo(image)    
    level = len(pyramid_images)
    for i in range(level-1, -1, -1):
        if (i-1) < 0:
            expand = cv2.pyrUp(pyramid_images[i], dstsize = image.shape[:2])
            lpls = cv2.subtract(image, expand)
            cv2.imshow("lapalian_down_"+str(i+1), lpls)
        else:
            expand = cv2.pyrUp(pyramid_images[i], dstsize = pyramid_images[i-1].shape[:2])
            lpls = cv2.subtract(pyramid_images[i-1], expand)
            cv2.imshow("lapalian_down_"+str(i+1), lpls)
            
src = cv2.resize(cv2.imread('shiyuan.png'),(256,256))
cv2.namedWindow('input_image') 
cv2.imshow('input_image', src)
lapalian_demo(src)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

"""直方图均衡化"""

import cv2
import numpy as np
img = cv2.imread('bai.png',0)
img = cv2.resize(img,(400,300))
equ = cv2.equalizeHist(img)
cv2.imshow('img',equ)
cv2.waitKey()
cv2.destroyAllWindows()

  • 平滑、锐化

函数功能
cv2.blur( )均值滤波
cv2.GaussianBlur( )高斯滤波
cv2.medianBlur( )中值滤波
cv2.bilateralFilter( )双边滤波
"""平滑、锐化"""
import cv2

img = cv2.imread('shiyuan.png')
img = cv2.resize(img,(300,300))
img1 = cv2.blur(img,(11,11))
img2 = cv2.GaussianBlur(img,(11,11),0)
img3 = cv2.medianBlur(img,11)
img4 = cv2.bilateralFilter(img,9,75,75)

M = np.ones((5, 5), np.float32) / 25
img5 = cv.filter2D(img, -1, M)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.imshow('img5',img5)

cv2.waitKey(0)
cv2.destroyAllWindows()

  • 数学形态学

函数功能
cv2.erode( )腐蚀
cv2.dilate( )膨胀
cv2.morphologyEx(,cv2.MORPH_OPEN)开运算
cv2.morphologyEx(,cv2.MORPH_CLOSE)闭运算
cv2.morphologyEx(,cv2.MORPH_TOPHAT)顶帽运算
cv2.morphologyEx(,cv2.MORPH_BLACKHAT)底帽运算
cv2.morphologyEx(,cv2.MORPH_GRADIENT)形态学梯度
"数学形态学"

import cv2

img = cv2.imread('shiyuan.png')
img = cv2.resize(img,(300,300))

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3))

img1 = cv2.dilate(img, kernel)
img2 = cv2.erode(img,kernel)

#设置结构元
kernel_rect=cv2.getStructuringElement(cv2.MORPH_RECT,(3,3))
kernel_cross=cv2.getStructuringElement(cv2.MORPH_CROSS,(3,3))
kernel_ellipse=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))

#图像开运算处理
open_rect=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_rect)
open_cross=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_cross)
open_ellipse=cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel_ellipse)

#图像闭运算处理
close_rect=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_rect)
close_cross=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_cross)
close_ellipse=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel_ellipse)

gradient_rect = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_rect)
gradient_cross = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_cross)
gradient_ellipse = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel_ellipse)

#顶帽变换
tophat_rect=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_rect)
tophat_cross=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_cross)
tophat_ellipse=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel_ellipse)

#顶帽变换
blackhat_rect=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_rect)
blackhat_cross=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_cross)
blackhat_ellipse=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel_ellipse)

cv2.imshow('blackhat_rect',blackhat_rect)
cv2.imshow('blackhat_cross',blackhat_cross)
cv2.imshow('blackhat_ellipse',blackhat_ellipse)
cv2.imshow('tophat_rect',tophat_rect)
cv2.imshow('tophat_cross',tophat_cross)
cv2.imshow('tophat_ellipse',tophat_ellipse)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('open_rect',open_rect)
cv2.imshow('open_cross',open_cross)
cv2.imshow('open_ellipse',open_ellipse)
cv2.imshow('close_rect',close_rect)
cv2.imshow('close_cross',close_cross)
cv2.imshow('close_ellipse',close_ellipse)
cv2.imshow('gradient_rect',gradient_rect)
cv2.imshow('gradient_cross',gradient_cross)
cv2.imshow('gradient_ellipse',gradient_ellipse)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


  • 阈值分割

函数功能
cv2.threshold(,cv2.THRESH_BINARY)二值化阈值
cv2.threshold(,cv2.THRESH_BINARY_INV)反二值化阈值
cv2.threshold(,cv2.THRESH_TOZERO)低阈值零处理
cv2.threshold(,cv2.THRESH_TOZERO_INV)超阈值零处理
cv2.threshold(,cv2.THRESH_OSTU)大津算法
cv2.threshold(,cv2.THRESH_TRIANGLE)截断阈值化处理
cv2.adaptiveThreshold(,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,)自适应阈值处理
cv2.adaptiveThreshold(,cv2.ADAPTIVE_THRESH_MEAN_C,)自适应阈值处理
"阈值分割"

import cv2

img = cv2.imread('shiyuan.png')
img = cv2.resize(img,(400,300))
img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img1 = cv2.threshold(img,110,255,cv2.THRESH_BINARY)
ret,img2 = cv2.threshold(img,110,255,cv2.THRESH_BINARY_INV)
ret,img3 = cv2.threshold(img,110,255,cv2.THRESH_TOZERO)
ret,img4 = cv2.threshold(img,110,255,cv2.THRESH_TOZERO_INV)
ret,img5 = cv2.threshold(img,110,255,cv2.THRESH_TRUNC)
ret,img6 = cv2.threshold(img,110,255,cv2.THRESH_TRIANGLE)
ret,img7 = cv2.threshold(img,110,255,cv2.THRESH_OTSU)
ret,img8 = cv2.threshold(cv2.GaussianBlur(img,(7,7),0),110,255,cv2.THRESH_OTSU)
img9 = cv2.adaptiveThreshold(img,127, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 11)
img10 = cv2.adaptiveThreshold(img,127,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,9,11)

cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.imshow('img5',img5)
cv2.imshow('img6',img6)
cv2.imshow('img7',img7)
cv2.imshow('img8',img8)
cv2.imshow('img9',img9)
cv2.imshow('img10',img10)
cv2.waitKey(0)
cv2.destroyAllWindows()

  • 边缘检测

函数功能
cv2.Canny( )Canny算子
cv2.findContours( )轮廓检测
cv2.filter2D( )边缘提取
"边缘检测"

import cv2

img = cv2.imread('bai.png')
img = cv2.resize(img,(400,300))
img1 = cv2.Canny(img,123,5)
 
cv2.imshow('img1',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
"""边缘检测"""

import cv2  
  
img = cv2.imread('bai.png')  
img = cv2.resize(img,(400,300))
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)  
  
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)  
cv2.drawContours(img,contours,-1,(0,0,255),1)  
  
cv2.imshow("img", img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()
"""边缘检测"""

import cv2
import numpy as np
def find_contours(kernel):
    img = cv2.imread('bai.png')
    img = cv2.resize(img,(400,300))
    img1 = cv2.filter2D(img,-1,kernel)
    cv2.imshow('img1',img1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

kernel1 = np.array((
        [0.0625, 0.125, 0.0625],
        [0.125, 0.25, 0.125],
        [0.0625, 0.125, 0.0625]), dtype="float32")

#Sobel算子
kernel2 = np.array(([-1,-2,-1],
                   [0,0,0],
                   [1,2,1]))

kernel3 = np.array(([-2,-1,0],
                   [-1,1,1],
                   [0,-1,-2]))

kernel4 = np.array([[-1,-1,-1],
                  [-1,8,-1],
                  [-1,-1,-1]])

kernel5 = np.array([[0,-1,0],
                   [-1,5,-1],
                   [0,-1,0]])

kernel6 = np.array([[0,1,0],
                   [1,-4,1],
                   [0,1,0]])

find_contours(kernel1)
find_contours(kernel2)
find_contours(kernel3)
find_contours(kernel4)
find_contours(kernel5)
find_contours(kernel6)

在这里插入图片描述


  • 色彩空间

函数功能
cv2.cvtColor(,cv2.COLOR_BGR2GRAY)图像灰度化
cv2.cvtColor(,cv2.COLOR_BGR2HSV)RGB转HSV
"""色彩空间"""

import cv2

img = cv2.imread('bai.png')
img = cv2.resize(img,(400,300))
img1 = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述


  • 形状绘制

函数功能
cv2.line( )绘制直线
cv2.circle( )绘制圆圈
cv2.ellipse( )绘制椭圆
cv2.rectangle( )绘制矩形
cv2.arrowedLine( )绘制箭头
cv2.putText( )绘制文本
"""形状绘制"""

import cv2

img = cv2.imread('bai.png')
img = cv2.resize(img,(400,300))
imgx = img.copy()
imgy = img.copy()
imgz = img.copy()
imgw = img.copy()

img = cv2.resize(img,(400,300))
img1 = cv2.line(img,(10,10),(200,300),(0,0,255),2)
img2 = cv2.circle(imgx,(60,60),30,(0,0,213),-1)
img3 = cv2.rectangle(imgy,(10,10),(100,80),(0,0,200),2)
img4 = cv2.ellipse(imgz,(256,256),(50,40),0,5,360,(20,213,79),-1)

font=cv2.FONT_HERSHEY_SIMPLEX
img5 = cv2.putText(imgw,'opencv',(80,90), font, 2,(255,255,255),3)

cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.imshow('img4',img4)
cv2.imshow('img5',img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述


写在最后

在这里插入T图片描述
资料包
下一期将扒拉sklearn库,该库是做机器学习的不二之选,欢迎大家搬好小板凳呀!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值