【OpenCV(01)】基本圖像操作、繪制,讀取視頻
目錄
- 圖像顏色加法
- 灰度化
- 二值化
- 仿射變換
圖像顏色加法
- 顏色加法
import cv2 as cv
import numpy as np#讀圖
cao = cv.imread('E:\hqyj\code\opencv\images\cao.png')
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
#飽和操作 cv.add(img1,img2) np.uint8
dst1 = cv.add(cao,pig)
#numpy直接相加 取模運算 對256取模 250+10=4
dst2 = cao+pig
# print(cao)
# print(pig)
# print(dst1)
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x,y)
xy2 = x+y
print(xy1)
print(xy2)dst3 = cv.addWeighted(cao,0.2,pig,0.8,0)
cv.imshow('dst3',dst3)cv.waitKey(0)
cv.destroyAllWindows()
- 圖像轉換
import cv2 as cv
import numpy as np# 讀取圖片
img = cv.imread('E:\hqyj\code\opencv\images\pig.png')
# 顏色轉換 cv.cvtColor(img, cv.COLOR_BGR2HSV)->圖像,轉換方式
# 灰度圖
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 轉hsv
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# bgr轉rgb
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)cv.waitKey(0)
cv.destroyAllWindows()
灰度化
- 最大值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):img[i,j] = max(pig[i,j,0],pig[i,j,1],pig[i,j,2])
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
- 平均值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):#將int():轉換為更大的類型,防止溢出img[i,j] =np.uint8((int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))/3)
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
- 加權平均值法
import cv2 as cv
import numpy as np#讀取圖像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#定義權重
wb,wg,wr = 0.114,0.587,0.299
#for循環遍歷像素點
for i in range(shape[0]):for j in range(shape[1]):#將int():轉換為更大的類型,防止溢出img[i,j] = round((wb * pig[i,j,0] + wg * pig[i,j,1] + wr * pig[i,j,2])//3)cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
二值化
- 二值化(閾值法)格式:閾值法:
_,binary = cv2.threshold(img,thresh,maxval,type)
_
和binary
:cv2.threshold 函數返回兩個值:一個是計算出的最佳閾值(retval),另一個是閾值處理后的圖像(binary),_
被用來忽略返回值中的第一個元素,即計算出的最佳閾值
img
:輸入圖像,要進行二值化處理的灰度圖。
thresh
:設定的閾值。當像素值大于(或小于,取決于閾值類型)thresh
時,該像素被賦予的值。
type
:閾值處理的類型。 - 自適應二值化格式:
cv2.adaptiveThreshold(image_np_gray, maxval, adaptiveMethod, thresholdType, blockSize, c)
其中各個參數的含義如下:
maxval
:最大閾值,一般為255
adaptiveMethod
:小區域閾值的計算方式:
ADAPTIVE_THRESH_MEAN_C
:小區域內取均值
ADAPTIVE_THRESH_GAUSSIAN_C
:小區域內加權求和,權重是個高斯核
thresholdType
:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是閾值法和反閾值法
blockSize
:選取的小區域的面積,如7就是7*7的小塊。(只能取奇數)
c
:最終閾值等于小區域計算出的閾值再減去此值
import cv2 as cv#讀圖
flower = cv.imread('E:\hqyj\code\opencv\images\\flower.png')
#灰度化處理
gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY)
gray = cv.resize(gray,(360,360))
cv.imshow('1.gray',gray)#二值化 1.閾值法 cv.THRESH_BINARY
thresh,binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
print(thresh)
cv.imshow('2.binary',binary)#2.反閾值法 cv.THRESH_BINARY_INV
_,binary_inv = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
cv.imshow('3.binary_inv',binary_inv)#3.截斷閾值法 cv.THRESH_TRUNC
_,binary_trunc = cv.threshold(gray,170,255,cv.THRESH_TRUNC)
cv.imshow('4.binary_trunc',binary_trunc)#4.低閾值零處理法 cv.THRESH_TOZERO
_,binary_tozero = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
cv.imshow('5.binary_tozero',binary_tozero)#5.超閾值零處理法 cv.THRESH_TOZERO_INV
_,binary_tozero_inv = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV)
cv.imshow('6.binary_tozero_inv',binary_tozero_inv)#6.OTSU閾值法
shresh1,otsu=cv.threshold(gray,200,255,cv.THRESH_OTSU)
#7.OTSU+反閾值法
shresh2,otsu_inv = cv.threshold(gray,shresh1,255,cv.THRESH_BINARY_INV)
print(shresh1)
print(shresh2)
cv.imshow('7.otsu',otsu)#自適應二值化 小區域計算 必須只能結合閾值法或反閾值法
#1.取均值
binary_adaptive = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,7,10)
#2.加權求和法 高斯核
adaptive_binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,10)
cv.imshow('8.binary_adaptive',binary_adaptive)
cv.imshow('9.adaptive_binary',adaptive_binary)cv.waitKey(0)
cv.destroyAllWindows()
仿射變換
- 仿射變換流程
1.讀圖cv.imread(),調尺寸cv.resize()
2.獲取仿射變換矩陣
1.旋轉:M = cv.getRotationMatrix2D(center,angle,scale) center:旋轉中心點的坐標,格式為`(x,y)`。angle:旋轉角度,單位為度,正值表示逆時針旋轉負值表示順時針旋轉。scale:縮放比例,若設為1,則不縮放。
2.平移:M = np.float32([[1,0,tx],[0,1,ty]])
3.縮放:M = np.float32([[sx,0,0],[0,sy,0]])
4.剪切:M = np.float32([[shx,1,0],[1,shy,0]])
- 旋轉
import cv2 as cv#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#獲取旋轉矩陣 cvv2.getRotationMatrix2D(center,angle,scale) 2x3
M = cv.getRotationMatrix2D((260,260),-45,1)
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
- 平移
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義平移量
tx,ty = 80,120
#定義平移矩陣
M = np.float32([[1,0,tx],[0,1,ty]])
#仿射變換函數 M = cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
- 縮放
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義縮放量
sx,sy = 0.5,0.5
#定義縮放矩陣
M = np.float32([[sx,0,0],[0,sy,0]])
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
- 剪切
import cv2 as cv
import numpy as np#讀圖
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定義縮放量
shx,shy = 0.5,0.5
#定義縮放矩陣
M = np.float32([[shx,1,0],[1,shy,0]])
#仿射變換函數 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()