今天我們就來繼續看一看OpenCV的使用,
第四篇
- 一、圖片的自由縮放以及邊緣裁剪
- 二、影像色調的調整
- 三、影像的旋轉、平移和翻轉
- 四、使用OpenCV擴大影像資料庫
- 1、色彩的隨機變換
- 2、對滑鼠的監控
今天使用的圖如下:

一、圖片的自由縮放以及邊緣裁剪
# 1、對于圖片的擴縮,OpenCV提供了一個簡單的函式:cv2.resize
img = cv2.imread("2.jpg")
dst = cv2.resize(img,(300,300))
cv2.imshow("test",dst)
cv2.waitKey()
我們首先是讀取了這張圖片,之后對齊進行重新構造(基于矩陣),所以圖片的整體是沒有變化的,只是外形發生變化:

那么我們也可以進行截取:
# 截取:
img2 = cv2.resize(img,(300,300))
patch_tree = img2[50:200,50:200]
cv2.imshow("test2",patch_tree)
cv2.waitKey()

(這里就是截取了重新構造之后的圖片)
二、影像色調的調整
CV2也可以對圖片進行色彩和亮度上的調整,也就是所謂的HSV(H是指色調,S是飽和度,V是明暗度)
至于具體的數值,H的取值是[0,180],其他兩個都是[0,255]
我們來看一下它們的影響:
色調H
用角度度量,取值范圍為0°~360°,從紅色開始按逆時針方向計算,紅色為0°,綠色為120°,藍色為240°,它們的補色是:黃色為60°,青色為180°,紫色為300°;
飽和度S
飽和度S表示顏色接近光譜色的程度,一種顏色,可以看成是某種光譜色與白色混合的結果,其中光譜色所占的比例愈大,顏色接近光譜色的程度就愈高,顏色的飽和度也就愈高,飽和度高,顏色則深而艷,光譜色的白光成分為0,飽和度達到最高,通常取值范圍為0%~100%,值越大,顏色越飽和,
明度V
明度表示顏色明亮的程度,對于光源色,明度值與發光體的光亮度有關;對于物體色,此值和物體的透射比或反射比有關,通常取值范圍為0%(黑)到100%(白),
現在我們在程式中具體的看一看把黃色削減:
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
# 下面這一行十分的關鍵 注意對180的取余
turn_green_hsv[:,:,0] = (turn_green_hsv[:,:,0] - 30) % 180
# 中括號里0表示選擇的是色調,1是飽和度,2是明暗度
turn_green_hsv = cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_green_hsv)
cv2.waitKey()
結果如圖:

如果減去120,就是這樣:

那么我們再來看看飽和度和明暗度的調整:
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
less_color_hsv = img_hsv.copy()
less_color_hsv[:,:,1] = less_color_hsv[:,:,1] * 0.6
turn_img = cv2.cvtColor(less_color_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_img)
cv2.waitKey()

目前是改變了圖片的飽和度,明暗度的調整也是同理,把引數改稱2就可以了,
三、影像的旋轉、平移和翻轉
OpenCV中影像的變換主要通過仿射變換矩陣和函式warpAffine()完成,
(可參考博客:仿射變換warpAffine)
img = cv2.imread("2.jpg")
M_copy_img = np.array([
[0,0.8,-100],
[0.8,0,-12]
],dtype=np.float32)
img_change = cv2.warpAffine(img,M_copy_img,(300,300))
cv2.imshow("test",img_change)
cv2.waitKey()

其中M_copy_img是仿射變換矩陣,這里前兩個矩陣的作用是縮小圖形為原來的80%,之后又逆時針旋轉90度,再向左平移100個像素單位,并向下平移12個像素單,
四、使用OpenCV擴大影像資料庫
1、色彩的隨機變換
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:,:,0] = (turn_green_hsv[:,:,0] + np.random.random()) % 180
turn_green_hsv[:,:,1] = (turn_green_hsv[:,:,1] + np.random.random()) % 180
turn_green_hsv[:,:,2] = (turn_green_hsv[:,:,2] + np.random.random()) % 180
turn_green_img = cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_green_img)
cv2.waitKey()

2、對滑鼠的監控
使用滑鼠在生成的圖片上標記出目標位置,是最基本的資料處理內容,滑鼠操作屬于用戶介面操作,在OpenCV中同樣有相關的函式可以實作,主要由mouse_event實作,
mouse_event函式的功能是監控滑鼠操作,對滑鼠的點擊、移動以及放開做出反應,根據不同的操作進行處理,
對滑鼠的監控一共有十種事件:
# define CV_EVENT_MOUSEMOVE 0 滑動
# define CV_EVENT_LBUTTONDOWN 1 左鍵點擊
# define CV_EVENT_RBUTTONDOWN 2 右鍵點擊
# define CV_EVENT_MBUTTONDOWN 3 中鍵點擊
# define CV_EVENT_LBUTTONUP 4 左鍵釋放
# define CV_EVENT_RBUTTONUP 5 右鍵釋放
# define CV_EVENT_MBUTTONUP 6 中鍵釋放
# define CV_EVENT_LBUTTONDBLCLK 7 左鍵雙擊
# define CV_EVENT_RBUTTONDBLCLK 8 右鍵雙擊
# define CV_EVENT_MBUTTONDBLCLK 9 中鍵釋放
當函式的事件完成后,會回傳所在的x、y值,分別代表事件發生時的(x,y)坐標,視窗默認左上為原點,右邊為x軸,向下為y軸,
使用示例(按‘q’退出):
img = cv2.imread("2.jpg")
rect_start = (0, 0)
rect_end = (0, 0)
def on_mouse(event,x,y,flags,param):
# 滑鼠左鍵按下,抬起,雙擊
if event == cv2.EVENT_LBUTTONDOWN:
rect_start = (x,y)
elif event == cv2.EVENT_LBUTTONUP:
rect_end = (x,y)
cv2.rectangle(img,rect_start,rect_end,(0,255,0),2)
cv2.namedWindow('test')
cv2.setMouseCallback("test",on_mouse)
while(1):
cv2.imshow("test",img)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cv2.destroyAllWindows()
這個就是不停的展出圖片,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/423166.html
標籤:AI
下一篇:Matlab 如何生成三維影像
