越來越覺得python是一強大的工具,處理樣本確實不錯。最近因項目需要涉及到圖片處理,所以開始用python調用opencv,再次覺得python真乃神器也!
一、主要函數
1、 cv2.imread():讀入圖片,共兩個參數,第一個參數為要讀入的圖片文件名,第二個參數為如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,并包括其alpha通道。
2、cv2.imshow():創建一個窗口顯示圖片,共兩個參數,第一個參數表示窗口名字,可以創建多個窗口中,但是每個窗口不能重名;第二個參數是讀入的圖片。
3、cv2.waitKey():鍵盤綁定函數,共一個參數,表示等待毫秒數,將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數為0,則表示無限期的等待鍵盤輸入。
4、cv2.destroyAllWindows():刪除建立的全部窗口。
5、cv2.destroyWindows():刪除指定的窗口。
6、cv2.imwrite():保存圖片,共兩個參數,第一個為保存文件名,第二個為讀入圖片。
Python-OpenCV 處理圖像基本操作
0x00. 圖片讀、寫和顯示操作
安裝好 OpenCV 之后,首先嘗試加載一張最簡單的圖片并顯示出來,代碼示例:
第一種方式使用cv2.cv的LoadImage、ShowImage和SaveImage函數
import cv2.cv as cv
# 讀圖片
image=cv.LoadImage(‘img/image.png’, cv.CV_LOAD_IMAGE_COLOR)#Load the image
#Or just: image=cv.LoadImage(‘img/image.png’)
cv.NamedWindow(‘a_window’, cv.CV_WINDOW_AUTOSIZE) #Facultative
cv.ShowImage(‘a_window’, image) #Show the image
# 寫圖片
cv.SaveImage(“thumb.png”, thumb)
cv.WaitKey(0) #Wait for user input and quit
也可以直接使用cv2的imread、imwrite和imshow函數
import numpy as np
import cv2
img = cv2.imread(‘messi5.jpg’,0)
cv2.imshow(‘image’,img)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit
cv2.destroyAllWindows()
elif k == ord(‘s’): # wait for ‘s’ key to save and exit
cv2.imwrite(‘messigray.png’,img)
cv2.destroyAllWindows()
imread函數還可以定義加載的mode,默認是以RGB模式處理圖片:
import cv2
grayImage = cv2.imread(‘MyPic.png’, cv2.CV_LOAD_IMAGE_GRAYSCALE)
# 可選參數CV_LOAD_IMAGE_COLOR (BGR), CV_LOAD_IMAGE_GRAYSCALE (grayscale), CV_LOAD_IMAGE_UNCHANGED(neither)
cv2.imwrite(‘MyPicGray.png’, grayImage)
0x01. 獲取圖片屬性
import cv2
img = cv2.imread(‘img/image.png’)
print img.shape
# (640, 640, 3)
print img.size
# 1228800
print img.dtype
# uint8
# 在debug的時候,dtype很重要
0x02. 輸出文本
在處理圖片的時候,我們經常會需要把一些信息直接以文字的形式輸出在圖片上,下面的代碼將實現這個效果:
import cv2.cv as cv
image=cv.LoadImage(‘img/lena.jpg’, cv.CV_LOAD_IMAGE_COLOR) #Load the image
font = cv.InitFont(cv.CV_FONT_HERSHEY_SIMPLEX, 1, 1, 0, 3, 8) #Creates a font
y = image.height / 2 # y position of the text
x = image.width / 4 # x position of the text
cv.PutText(image,“Hello World !”, (x,y),font, cv.RGB(255, 255, 255)) #Draw the text
cv.ShowImage(‘Hello World’, image) #Show the image
cv.WaitKey(0)
cv2:
cv2.putText(frame, ‘Hello World’, (300,100), 0, 0.5, (0,0,255),2)
0x03. 縮放圖片
下面的例子將實現縮放圖片并保存,這個在使用 OpenCV 做圖像處理的時候都是很常用的操作:
import cv2.cv as cv
im = cv.LoadImage(“img/alkaline.jpg”) #get the image
thumb = cv.CreateImage((im.width / 2, im.height / 2), 8, 3) #Create an image that is twice smaller than the original
cv.Resize(im, thumb) #resize the original image into thumb
#cv.PyrDown(im, thumb)
cv.SaveImage(“thumb.png”, thumb) # save the thumb image
cv2:
import cv2
import numpy as np
img = cv2.imread(‘messi5.jpg’)
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
#OR
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
0x04. 圖像平移
import cv2
import numpy as np
img = cv2.imread(‘messi5.jpg’,0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow(‘img’,dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
0x05. 圖像旋轉
img = cv2.imread(‘messi5.jpg’,0)
rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
0x06. 仿射變換
import cv2
import numpy as np
img = cv2.imread(‘mao.jpg’)
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow(‘image’,dst)
cv2.waitKey(0)
0x07. 圖像顏色變換
實際使用過程中,我們經常也需要對一些圖片的顏色空間做一些改變之類的:
c2.cv:
import cv2.cv as cv
im=cv.LoadImage(‘img/fruits.jpg’,cv.CV_LOAD_IMAGE_COLOR)
res = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3) #cv.CV_32F, cv.IPL_DEPTH_16S, 。。。
cv.Convert(im, res)
cv.ShowImage(“Converted”,res)
res2 = cv.CreateImage(cv.GetSize(im), cv.CV_8UC2, 3)
cv.CvtColor(im, res2, cv.CV_RGB2BGR) # HLS, HSV, YCrCb, 。。。。
cv.ShowImage(“CvtColor”, res2)
cv.WaitKey(0)
cv.Convert():將圖片從一個顏色空間轉到另一個顏色空間
cv.CvtColor(src, dst, code):
cv2:
cv2.cvtColor(input_image, flag)函數實現圖片顏色空間的轉換,flag 參數決定變換類型。如 BGR-》Gray flag 就可以設置為 cv2.COLOR_BGR2GRAY 。
一個簡單的例子,下面的代碼實現識別攝像視頻中藍色的部分:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while(1):
# 讀取視頻的每一幀
_, frame = cap.read()
# 將圖片從 BGR 空間轉換到 HSV 空間
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 定義在HSV空間中藍色的范圍
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
# 根據以上定義的藍色的閾值得到藍色的部分
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(frame,frame, mask= mask)
cv2.imshow(‘frame’,frame)
cv2.imshow(‘mask’,mask)
cv2.imshow(‘res’,res)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
以上的代碼給出了視頻中獲取興趣對象的基本思想。
0x08. 通道的拆分/合并處理
對于一張圖片的 R、G、B 通道,我們可以很方便的使用 OpenCV 獲取并分離或者合并:
(這是將圖像灰度化處理的一種方式)
cv2.cv
import cv2.cv as cv
orig = cv.LoadImage(‘img/fruits.jpg’)
b = cv.CreateImage(cv.GetSize(orig), orig.depth, 1)
g = cv.CloneImage(b)
r = cv.CloneImage(b)
cv.Split(orig, b, g, r, None)
merged = cv.CreateImage(cv.GetSize(orig), 8, 3)
cv.Merge(g, b, r, None, merged)
cv.ShowImage(“Image”, orig)
cv.ShowImage(“Blue”, b)
cv.ShowImage(“Green”, g)
cv.ShowImage(“Red”, r)
cv.ShowImage(“Merged”, merged)
cv.WaitKey(0)
cv2
import cv2
img = cv2.imread(‘img/image.png’)
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
0x09. 圖片添加邊距
cv2.copyMakeBorder函數
import cv2
import numpy as np
BLUE = [255,0,0]
img1 = cv2.imread(‘opencv_logo.png’)
replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)
python加opencv進行圖像處理完整代碼如下:
[python] view plain copyimport os
import re
import sys
import cv2
from optparse import OptionParser
import numpy as np
def rotateImage(image, angel):#parameter angel in degrees
height = image.shape[0]
width = image.shape[1]
## height_big = height * 2
## width_big = width * 2
height_big = height
width_big = width
image_big = cv2.resize(image, (width_big, height_big))
image_center = (width_big/2, height_big/2)#rotation center
## rot_mat = cv2.getRotationMatrix2D(image_center,angel, 0.5)
rot_mat = cv2.getRotationMatrix2D(image_center,angel, 1.0)
result = cv2.warpAffine(image_big, rot_mat, (width_big, height_big), flags=cv2.INTER_LINEAR)
return result
filepath=‘E:\\data\\faceScrub2\\38743.jpg’
##im=cv2.imread(filepath,cv2.cv.CV_LOAD_IMAGE_COLOR)
im=cv2.imread(filepath,cv2.cv.CV_LOAD_IMAGE_GRAYSCALE)
im_rot=rotateImage(im,20)
im_smooth=cv2.GaussianBlur(im,(3,3),3.0)
##im_flip=cv2.flip(im,0)
im_flip1=cv2.flip(im,-1)
im_flip2=cv2.flip(im,1)
##im_he=cv2.equalizeHist(im)
##cv2.imshow(‘test’,im)
##cv2.imshow(‘rotated’,im_rot)
##cv2.imshow(‘smooth’,im_smooth)
##cv2.imshow(‘f0’,im_flip)
##cv2.imshow(‘fn’,im_flip1)
##cv2.imshow(‘fp’,im_flip2)
##cv2.imshow(‘he’,im_he)
cv2.imwrite(‘H:\\flipimg.jpg’,im_rot)
##cv2.waitKey(0)
評論
查看更多