OpenCV:圖片操作基本知識
歡迎關注公眾號:大鄧帶你玩Python
圖像基本知識
圖像是由像素組成的,而像素實際上就是帶有坐標位置和顏色信息的點。我們把圖片想像成由若干行,若干列的點組成的, 現實中有RGB顏色系統,我們可以把圖中任意一點(位置在第m行,第n列)的點A表示為
A[m,n] = [blue,green,red]
圖片數據解讀
A[m,n] = [blue,green,red]
參數 |解讀m |A點在圖像中的第m行 n |A點在圖像中的第n列blue |表示藍色,三原色(RGB)的第一個數值
green|表示綠色,三原色(RGB)的第二個數值red |表示紅色,三原色(RGB)的第一個數值
一、OpenCV-python基本操作
1.1讀入圖像文件
import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path) #winname彈出窗口的名字,mat為傳入的圖片對象cv2.imshow(winname="show the image",mat=image) #窗口默認一直處於彈出窗狀態cv2.waitKey() #按任意鍵盤,銷毀窗口cv2.destroyAllWindows()
1.2我們先檢驗下圖片數據類型
在一開始我們說圖片是由像素組成的,我們可以先檢驗下讀入的圖片數據是什麼類型數據,長什麼樣?
其實讀入的是數組,不信你看下面
>>>import cv2>>>img_path = "test.jpg" >>>image = cv2.imread(filename=img_path) >>>print(type(image)) >>><class "numpy.ndarray">#image這個數據是三維的>>>print(image.ndim)>>>3
image的shape
800行,480列的點組成的圖片,RGB三色,圖片為彩色
>>>print(image.shape) >>>(800,480,3)
我們檢查下第5行,第6列像素的值
>>>print(image[4,5]) >>>[161 185 221] >>>print(type(image[4,5])) >>><class "numpy.ndarray">
好像很複雜,但實際上就是ndarray數組,對此有疑惑的可以看看我公眾號的numpy基本知識。
1.3獲取圖片尺寸
首先我們查看測試圖片的詳情
這個圖片選自iphone7壁紙,最大數800肯定是高,寬是480。
那麼問題來了,我們如何通過程序運行獲得圖片的尺寸?
>>>import cv2>>>img_path = "/test.jpg" >>>image = cv2.imread(filename=img_path) >>>print(image.shape) >>>(800, 480, 3)
程序返回(800, 480, 3),說明image.shape返回的元組中第一個參數是高,第二個是寬。請記住!
1.4圖像亮度
blue,green,red分別代表藍綠紅,每個數值代表的原色的亮度大小。
blue,green,red值越大,圖像越亮,當[255,255,255]時,圖像為純白色。越小,圖像越黑暗,當[0,0,0]時,圖像為純黑。
搞明白這點,我們把原圖分別調亮50%,調黑50%如圖。即將green,blue,red數值乘以1.5或0.5 。
import cv2import osimg_path = "test.jpg"image = cv2.imread(filename=img_path)cv2.imshow(winname="raw image",mat=image) #獲取圖片像素數組的行數和列數row_num = image.shape[0]column_num = image.shape[1] #對image數據進行複製bright_image = image.copy() #對像素blue/green/red值整體變為原來的1.5倍,圖片變亮 for row in range(row_num): for column in range(column_num): bright_image[row, column, 0] = bright_image[row, column, 0]* 1.5 bright_image[row, column, 1] = bright_image[row, column, 1] * 1.5 bright_image[row, column, 2] = bright_image[row, column, 2] * 1.5cv2.imshow(winname="show bright image",mat=bright_image)black_image = image.copy() #對像素blue/green/red值整體變為原來的0.5倍,圖片變黑暗 for row in range(row_num): for column in range(column_num): black_image[row, column, 0] = black_image[row, column, 0]* 0.5 black_image[row, column, 1] = black_image[row, column, 1] * 0.5 black_image[row, column, 2] = black_image[row, column, 2] * 0.5cv2.imshow(winname="show black image",mat=black_image)cv2.waitKey()cv2.destroyAllWindows()
中間為原圖,左側為調亮30%後的效果,右側為調黑30%的效果。
1.5 製作日落效果圖
觀看了《機器學習實踐指南》,裡面有個將圖片製作成日落效果的案例。只需要把blue、green值變為原來的70%即可實現日落效果。
import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path) #顯示原圖cv2.imshow(winname="raw image",mat=image)row_num = image.shape[0]column_num = image.shape[1] #日落效果,將藍色與綠色調整為原來的70% for row in range(row_num): for column in range(column_num): image[row, column, 0] = image[row, column, 0]* 0.7 image[row, column, 1] = image[row, column, 1] * 0.7 #顯示日落效果圖cv2.imshow(winname="show sunload image",mat=image)cv2.waitKey()cv2.destroyAllWindows()
左側為原圖,右側為日落效果圖。
1.6在圖片上輸出文本
使用cv2.putText即可在圖片中添加文字。
cv2.putText(img,text,org,fontFace,fontScale,color)
參數 |解讀img |cv2讀入的圖片數據txt |要寫入的文本org |文字在圖片中的坐標。坐標原點位於圖片左上角。如org=(100,400),從圖片 最左邊起100,從最最上面往下400。fontFace|字體。如cv2.FONT_HERSHEY_TRIPLEX、cv2.FONT_HERSHEY_PLAINcolor |顏色,三原數組,使用RGB模式編碼。如白色為(255,255,255)
import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path)cv2.imshow(winname="raw image",mat=image)#文字在圖中的坐標(注意:這裡的坐標原點是圖片左上角)x, y = 100, 400cv2.putText(img = image, text = "Beautiful Scene!", org = (x, y), fontFace = cv2.FONT_HERSHEY_TRIPLEX, fontScale = 1, color = (255,255,255))cv2.imshow(winname="add text on image",mat=image)cv2.waitKey()cv2.destroyAllWindows()
左側為原圖,右側為加文字的圖片效果。Beautiful Scene
1.7縮放圖片
使用下面方法縮放圖片
resize(src, dsize, fx, fy)
參數 |解讀src |讀入的圖片數據dsize |輸出圖片的尺寸。如果dsize為None(或0),程序會默認執行disze=(fx*src*cols,fy*src*rows) fx |圖片水平方向的縮放比例(倍數) fy |圖片垂直方向的縮放比例(倍數)
import cv2import osimg_path = "test.jpg"image = cv2.imread(filename=img_path) #顯示原圖cv2.imshow(winname="raw image",mat=image) #更改fx,fy即可改變圖片比例。垂直方向fy大小不變,水平方向fx變為原來的0.5倍。smaller_image = cv2.resize(src=image,dsize=None,fx=0.5,fy=1)cv2.imshow(winname="smaller image",mat=smaller_image)cv2.waitKey()cv2.destroyAllWindows()
右側為原圖,左側為縮小後的圖片(水平變原圖的0.5倍,垂直方向保持不變。)
圖像的旋轉
getRotationMatrix2D(center, angle, scale),這個函數需要三個參數,旋轉中心,旋轉角度,旋轉後圖像的縮放比例
import cv2image_path = "test.jpg"image = cv2.imread(filename=image_path)rows,cols = image.shape[:2] #第一個參數旋轉中心,第二個參數旋轉角度,第三個參數:縮放比例M = cv2.getRotationMatrix2D((cols/2,rows/2), 10, 0.4) #第三個參數:變換後的圖像大小new_image = cv2.warpAffine(image,M,(rows,cols))cv2.imshow("raw image",image)cv2.imshow("new_image",new_image)cv2.waitKey()cv2.destroyAllWindows()
左側為原圖,右側為以圖片中心旋轉10,尺寸為原圖0.4倍,操作後的圖片
歡迎關注公眾號:大鄧帶你玩Python
推薦閱讀:
※Python 機器學習之 SVM 預測買賣(標的物:比特幣)
※Python魔法方法指南
※【深度技術】小試牛刀:使用Python模擬登錄知乎
※認準目標,前進