1. 程式人生 > 其它 >python opencv處理圖片

python opencv處理圖片

1、影象讀入:cv2.imread()

使用函式cv2.imread(filepath,flags) 讀入影象。第二個引數是要告訴函式應該如何讀取這幅圖片。

  • cv2.IMREAD_COLOR:預設引數,讀入一副彩色圖片,忽略alpha通道
    cv2.IMREAD_GRAYSCALE:讀入灰度圖片
    cv2.IMREAD_UNCHANGED:顧名思義,讀入完整圖片,包括alpha通道

PS:呼叫opencv時,即使影象的路徑是錯的,OpenCV 也不會報錯,但執行命令print img時得到的結果是None。

2、顯示影象cv2.imshow()

使用函式cv2.imshow(win_name,img) 顯示影象。第一個引數是顯示影象的視窗的名字,第二個引數是要顯示的影象(imread讀入的影象),視窗大小自動調整為圖片大小。你可以建立多個視窗,但是必須給他們不同的名字。

  • cv2.imshow('image',img)
  • cv2.waitKey(0)
  • cv2.destroyAllWindows() #cv2.destroyWindow(wname)

cv2.waitKey顧名思義等待鍵盤輸入,單位為毫秒,即等待指定的毫秒數看是否有鍵盤輸入,若在等待時間內按下任意鍵則返回按鍵的ASCII碼,程式繼續執行。若沒有按下任何鍵,超時後返回-1。引數為0表示無限等待。不呼叫waitKey的話,視窗會一閃而逝,看不到顯示的圖片。
cv2.destroyAllWindow()銷燬所有視窗
cv2.destroyWindow(wname)銷燬指定視窗

3、儲存影象cv2.imwrite()

  • cv2.imwrite(file,img,num),第一個引數是要儲存的檔名,第二個引數是要儲存的影象。可選的第三個引數,它針對特定的格式:對於JPEG,其表示的是影象的質量,用0 - 100的整數表示,預設95;對於png ,第三個引數表示的是壓縮級別。預設為3

cv2.IMWRITE_JPEG_QUALITY型別為 long ,必須轉換成 int
cv2.IMWRITE_PNG_COMPRESSION, 從0到9 壓縮級別越高影象越小。
cv2.imwrite('1.png',img, [int( cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('1.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 9])

4、圖片縮放cv2.resize()

cv2.resize(InputArray, OutputArray, Size, fx, fy, interpolation)

引數解釋:

  • InputArray src 輸入圖片
  • OutputArray dst 輸出圖片
  • Size 輸出圖片尺寸,輸出尺寸格式為(寬,高)
  • fx, fy 沿x軸,y軸的縮放係數
  • interpolation 插入方式,預設的插值方法為:雙線性插值

interpolation 選項所用的插值方法:

  • INTER_NEAREST 最近鄰插值
  • INTER_LINEAR 雙線性插值(預設設定)
  • INTER_AREA 使用畫素區域關係進行重取樣。
  • INTER_CUBIC 4x4畫素鄰域的雙三次插值
  • INTER_LANCZOS4 8x8畫素鄰域的Lanczos插值
import cv2 as cv

img = cv.imread('test.jpg') # 讀入原圖片
print(img.shape) # 打印出圖片尺寸
x, y = img.shape[0:2] # 將圖片高和寬分別賦值給x,y
cv.imshow('OriginalPicture', img) # 顯示原圖

img_test1
= cv.resize(img, (int(y / 2), int(x / 2)))# 縮放到原來的二分之一,輸出尺寸格式為(寬,高)
cv.imshow('resize0', img_test1)
cv.waitKey()

img_test2 = cv.resize(img, (0, 0), fx=0.25, fy=0.25, interpolation=cv.INTER_NEAREST) # 最近鄰插值法縮放,縮放到原來的四分之一
cv.imshow('resize1', img_test2)
cv.waitKey()
cv.destroyAllWindows()

綜合舉例:

import os
import cv2
import glob

bmp_files=glob.glob('*.bmp')
for i,file in enumerate(bmp_files):
  img
= cv2.imread(file,-1) # 讀圖,-1為不改變圖片格式,0為灰度圖
newName = file.replace('.bmp','.jpg')
img_new
=cv2.resize(img,(960,540))
  cv2.imwrite(os.path.join(jpg_dir,newName),img,[cv2.IMWRITE_JPEG_QUALITY,
85]) #壓縮圖片
  print('第%d張圖:%s'%(i+1,newName))

參考:https://blog.csdn.net/qq_36563273/article/details/110000276

https://blog.csdn.net/fu6543210/article/details/80835280