日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python——opencv入门(一)

發(fā)布時(shí)間:2023/12/15 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python——opencv入门(一) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1、 OpenCV的結(jié)構(gòu)

和Python一樣,當(dāng)前的OpenCV也有兩個(gè)大版本,OpenCV2和OpenCV3。相比OpenCV2,OpenCV3提供了更強(qiáng)的功能和更多方便的特性。不過(guò)考慮到和深度學(xué)習(xí)框架的兼容性,以及上手安裝的難度,這部分先以2為主進(jìn)行介紹。

根據(jù)功能和需求的不同,OpenCV中的函數(shù)接口大體可以分為如下部分:

  • core:核心模塊,主要包含了OpenCV中最基本的結(jié)構(gòu)(矩陣,點(diǎn)線和形狀等),以及相關(guān)的基礎(chǔ)運(yùn)算/操作。

  • imgproc:圖像處理模塊,包含和圖像相關(guān)的基礎(chǔ)功能(濾波,梯度,改變大小等),以及一些衍生的高級(jí)功能(圖像分割,直方圖,形態(tài)分析和邊緣/直線提取等)。

  • highgui:提供了用戶(hù)界面和文件讀取的基本函數(shù),比如圖像顯示窗口的生成和控制,圖像/視頻文件的IO等。

如果不考慮視頻應(yīng)用,以上三個(gè)就是最核心和常用的模塊了。針對(duì)視頻和一些特別的視覺(jué)應(yīng)用,OpenCV也提供了強(qiáng)勁的支持:

  • video:用于視頻分析的常用功能,比如光流法(Optical Flow)和目標(biāo)跟蹤等。

  • calib3d:三維重建,立體視覺(jué)和相機(jī)標(biāo)定等的相關(guān)功能。

  • features2d:二維特征相關(guān)的功能,主要是一些不受專(zhuān)利保護(hù)的,商業(yè)友好的特征點(diǎn)檢測(cè)和匹配等功能,比如ORB特征。

  • object:目標(biāo)檢測(cè)模塊,包含級(jí)聯(lián)分類(lèi)和Latent SVM

  • ml:機(jī)器學(xué)習(xí)算法模塊,包含一些視覺(jué)中最常用的傳統(tǒng)機(jī)器學(xué)習(xí)算法。

  • flann:最近鄰算法庫(kù),Fast Library for Approximate
    Nearest Neighbors,用于在多維空間進(jìn)行聚類(lèi)和檢索,經(jīng)常和關(guān)鍵點(diǎn)匹配搭配使用。

  • gpu:包含了一些gpu加速的接口,底層的加速是CUDA實(shí)現(xiàn)。

  • photo:計(jì)算攝像學(xué)(Computational Photography)相關(guān)的接口,當(dāng)然這只是個(gè)名字,其實(shí)只有圖像修復(fù)和降噪而已。

  • stitching:圖像拼接模塊,有了它可以自己生成全景照片。

  • nonfree:受到專(zhuān)利保護(hù)的一些算法,其實(shí)就是SIFT和SURF。

  • contrib:一些實(shí)驗(yàn)性質(zhì)的算法,考慮在未來(lái)版本中加入的。

  • legacy:字面是遺產(chǎn),意思就是廢棄的一些接口,保留是考慮到向下兼容。

  • ocl:利用OpenCL并行加速的一些接口。

  • superres:超分辨率模塊,其實(shí)就是BTV-L1(Biliteral Total Variation – L1
    regularization)算法

  • viz:基礎(chǔ)的3D渲染模塊,其實(shí)底層就是著名的3D工具包VTK(Visualization Toolkit)。

從使用的角度來(lái)看,和OpenCV2相比,OpenCV3的主要變化是更多的功能和更細(xì)化的模塊劃分。

2、python——opencv基礎(chǔ)

2.1 圖像的表示

已知單通道的灰度圖像在計(jì)算機(jī)中的表示是一個(gè)8位無(wú)符號(hào)整形的矩陣,在oncv的C++代碼中,表示圖像有專(zhuān)門(mén)的結(jié)構(gòu)cv::Mat,但python中有numpy這種強(qiáng)大的基礎(chǔ)工具,所以該矩陣就用numpy的array表示,多通道就是紅綠藍(lán)(RGB)三通道。

2.2 基本處理

(1)讀取圖像:cv.imread()

可以按照不同模式讀取,一般最常用到的是讀取單通道灰度圖,或者直接默認(rèn)讀取多通道

(2)儲(chǔ)存圖像:cv.imwrite()

import cv2 color_img=cv2.imread('4.jpg') print(color_img.shape)# 讀取單通道 gray_img=cv2.imread('4.jpg',cv2.IMREAD_GRAYSCALE) print(gray_img.shape)#把單通道圖像保存后,再讀取,仍然是3通道,相當(dāng)于將單通道復(fù)制到3個(gè)通道保存 cv2.imwrite('grayscale_4.jpg',gray_img) reload_grayscale=cv2.imread('grayscale_4.jpg') print(reload_grayscale.shape)# 指定jpg質(zhì)量,范圍從1~100,默認(rèn)95,值越高畫(huà)質(zhì)越好,文件越大 cv2.imwrite('anglababy.jpg',color_img,(cv2.IMWRITE_JPEG_QUALITY,20))

(2)縮放、裁剪、補(bǔ)邊

  • 縮放:im.resize()

  • 裁剪:利用array下標(biāo)截取實(shí)現(xiàn)

import cv2 img=cv2.imread('dog.jpg')# 縮小為200x200的正方形 img_200x200=cv2.resize(img,(200,200))# 不直接指定縮放后的大小,通過(guò)fx和fy指定縮放比例,0.5表示長(zhǎng)寬各一半 # 插值方法默認(rèn)為cv2.INTER_LINEAR,這里指定為最近鄰插值 img_half=cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)# 上下各貼50像素的黑邊 img_add=cv2.copyMakeBorder(img,50,50,0,0,cv2.BORDER_CONSTANT,value=(0,0,0))# 裁剪 patch_img=img[20:150,-180:-50]cv2.imshow("image",img_200x200) cv2.imshow("img_half",img_half) cv2.imshow("img_add",img_add) cv2.imshow("patch_img",patch_img) cv2.waitKey(0)

(3)色調(diào)、明暗、直方圖、Gamma曲線

比如可以通過(guò)HSV空間對(duì)色調(diào)和明暗進(jìn)行調(diào)節(jié)。HSV空間是由美國(guó)的圖形學(xué)專(zhuān)家A. R. Smith提出的一種顏色空間,HSV分別是色調(diào)(Hue),飽和度(Saturation)和明度(Value)。在HSV空間中進(jìn)行調(diào)節(jié)就避免了直接在RGB空間中調(diào)節(jié)是還需要考慮三個(gè)通道的相關(guān)性。OpenCV中H的取值是[0, 180),其他兩個(gè)通道的取值都是[0, 256),下面例子接著上面例子代碼,通過(guò)HSV空間對(duì)圖像進(jìn)行調(diào)整:

import cv2img=cv2.imread('mushroom.jpg') # 通過(guò)cv2.cvtcolor把圖像從RGB轉(zhuǎn)到HSV img_hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)# H空間中,綠色比黃色值高,所以給每個(gè)像素+15,黃色的就會(huì)變綠 turn_green_hsv=img_hsv.copy() turn_green_hsv[:,:,0]=(turn_green_hsv[:,:,0]+15) turn_green_img=cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)cv2.imshow("turn_green_img",turn_green_img)# 減小飽和度會(huì)讓圖像損失鮮艷,變得更灰 colorless_hsv=img_hsv.copy() colorless_hsv[:,:,1]=0.5*colorless_hsv[:,:,1] colorless_img=cv2.cvtColor(colorless_hsv,cv2.COLOR_HSV2BGR) cv2.imshow("colorless_img",colorless_img)# 減小為原來(lái)的一半 darker_hsv=img_hsv.copy() darker_hsv[:,:,2]=0.5*darker_hsv[:,:,2] darker_img=cv2.cvtColor(darker_hsv,cv2.COLOR_HSV2BGR) cv2.imshow("darker_img",darker_img)cv2.waitKey(0)

直方圖:方便對(duì)圖像的像素值分布了解更清晰,低的像素值表示暗的部分,高的值表示亮度大的部分,但是顯示的時(shí)候可能就出現(xiàn)了暗部細(xì)節(jié)不足或者亮部細(xì)節(jié)丟失的情況。

Gamma變換:提升暗部細(xì)節(jié),Gamma變換是矯正相機(jī)直接成像和人眼感受圖像差別的一種常用手段,簡(jiǎn)單來(lái)說(shuō)就是通過(guò)非線性變換讓圖像從對(duì)曝光強(qiáng)度的線性響應(yīng)變得更接近人眼感受到的響應(yīng)。

import numpy as np import cv2 import matplotlib.pylab as plt from mpl_toolkits.mplot3d import Axes3Dimg=cv2.imread('4.jpg')# 分通道計(jì)算每個(gè)通道的直方圖 hist_b=cv2.calcHist([img],[0],None,[256],[0,256]) hist_g=cv2.calcHist([img],[1],None,[256],[0,256]) hist_r=cv2.calcHist([img],[2],None,[256],[0,256])# Gamma變換的函數(shù) def gamma_trans(img,gamma):# 先歸一化到1,之后利用gamma作為指數(shù)求出新值,再還原gamma_table=[np.power(x/255.0,gamma)*255.0 for x in range(256)]gamma_table=np.round(np.array(gamma_table)).astype(np.uint8)# 用opencv的查表函數(shù)實(shí)現(xiàn)該映射return cv2.LUT(img,gamma_table)# 執(zhí)行Gamma變換,小于1的值讓暗細(xì)節(jié)大量提升,同時(shí)亮部細(xì)節(jié)少量提升 img_corrected=gamma_trans(img,0.5) cv2.imshow("img",img) cv2.imshow("img_corrected",img_corrected) # cv2.waitKey(0)# 分通道計(jì)算Gamma矯正后的直方圖 hist_b_corrected=cv2.calcHist([img_corrected],[0],None,[256],[0,256]) hist_g_corrected=cv2.calcHist([img_corrected],[1],None,[256],[0,256]) hist_r_corrected=cv2.calcHist([img_corrected],[2],None,[256],[0,256])# 直方圖可視化fig=plt.figure() pix_hists=[[hist_b,hist_g,hist_r],[hist_b_corrected,hist_g_corrected,hist_r_corrected] ] pix_vals=range(256) for sub_plt,pix_hist in zip([121,122],pix_hists):ax=fig.add_subplot(sub_plt,projection='3d')for c,z,channel_hist in zip(['b','g','r'],[20,10,0],pix_hist):cs=[c]*256ax.bar(pix_vals,channel_hist,zs=z,zdir='y',color=cs,alpha=0.618,edgecolor='none',lw=0)ax.set_xlabel('Pixel Values')ax.set_xlim([0,256])ax.set_ylabel('Channels')ax.set_zlabel('Counts')plt.show()



(4)仿射變換

圖像的仿射變換涉及到圖像的形狀位置角度的變化,是深度學(xué)習(xí)預(yù)處理中常到的功能,在此簡(jiǎn)單回顧一下。仿射變換具體到圖像中的應(yīng)用,主要是對(duì)圖像的縮放,旋轉(zhuǎn),剪切,翻轉(zhuǎn)和平移的組合。在OpenCV中,仿射變換的矩陣是一個(gè)2×3的矩陣,其中左邊的2×2子矩陣是線性變換矩陣,右邊的2×1的兩項(xiàng)是平移項(xiàng):

對(duì)于圖像上的任一位置(x,y),仿射變換執(zhí)行的是如下的操作:

需要注意的是,對(duì)于圖像而言,寬度方向是x,高度方向是y,坐標(biāo)的順序和圖像像素對(duì)應(yīng)下標(biāo)一致。所以原點(diǎn)的位置不是左下角而是右上角,y的方向也不是向上,而是向下。在OpenCV中實(shí)現(xiàn)仿射變換是通過(guò)仿射變換矩陣和cv2.warpAffine()這個(gè)函數(shù):

import numpy as np import cv2img = cv2.imread('dog.jpg')# 沿著橫縱軸放大1.6倍,之后平移(-150,-240),最后沿原圖大小截取,等效于剪裁并放大 M_crop_dog = np.array([[1.6, 0, -150],[0, 1.6, -240] ], dtype=np.float32)# cv2.warpAffine(原始圖像, 變換矩陣,變換后的圖像大小) img_dog = cv2.warpAffine(img, M_crop_dog,(400, 400)) cv2.imshow("img_dog", img_dog)# x軸的剪切變換,逆時(shí)針旋轉(zhuǎn)角度15° theta=15*np.pi/180 M_shear=np.array([[1,np.tan(theta),0],[0,1,0] ],dtype=np.float32)img_sheared=cv2.warpAffine(img,M_shear,(400,600)) cv2.imshow("img_sheared",img_sheared)# 順時(shí)針旋轉(zhuǎn),角度15° M_rotate=np.array([[np.cos(theta),-np.sin(theta),0],[np.sin(theta),np.cos(theta),0] ],dtype=np.float32)im_rotate=cv2.warpAffine(img,M_rotate,(400,600)) cv2.imshow("im_rotate",im_rotate)# 旋轉(zhuǎn)+縮放+旋轉(zhuǎn)組合,可以通過(guò)SVD分解理解 M=np.array([[1,1.5,-400],[0.5,2,-100] ],dtype=np.float32)img_transformed=cv2.warpAffine(img,M,(400,600)) cv2.imshow("img_transformed",img_transformed)cv2.waitKey(0)

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的python——opencv入门(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。