目錄
1.1影像的匯入和匯出
1.2像素運算
1.3ROI與填充
1.4模糊與銳化操作
1.5邊緣保留濾波
1.6影像二值化
1.7影像直方圖
1.8繪制外輪廓
1.9物件測量
1.10區分指定外輪廓
1.11腐蝕與膨脹
1.12開閉操作
可以下面代碼直接運行,也可以看我的b站視頻,有配套的教學,代碼演示,有問題的可以留言,b站視頻傳送門
廢話不多說,直接上代碼
1.1影像的匯入和匯出
import cv2 #匯入opencv庫
def get_image_info(image): #定義加載影像資訊函式
print(type(image)) #讀取該圖片類別
print(image.shape) #加載影像的長寬和通道數
print(image.size) #加載影像的大小
print(image.dtype) #加載位元組位數占多少
img = cv2.imread('1.jpg') #讀入圖片
cv2.imshow('image', img) #圖片顯示
get_image_info(img) #呼叫加載圖片資訊函式
cv2.waitKey(0) #等待時間
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度化
cv2.imwrite('./2.jpg', gray) #寫出圖片到當前檔案夾下
cv2.waitKey(0)

加載并顯示圖片1.jpg,然后灰度化,并保存在本地
1.2像素運算
import cv2 as cv
def add_demo(m1, m2): #定義像素相加函式
dst = cv.add(m1, m2) #對像素進行加法運算
cv.imshow("add_demo", dst) #顯示像素相加后的影像
def subtract_demo(m1, m2):
dst = cv.subtract(m1, m2)
cv.imshow("subtract_demo",dst)
scr1 = cv.imread("3.jpg") #讀入當前檔案夾下名稱為3.jpg圖片
scr2 = cv.imread("4.jpg") #讀入4.jpg圖片
print(scr1.shape) #顯示圖片3的大小
print(scr2.shape) #顯示圖片4的大小 進行像素加減乘除需要兩個圖片格式大小一樣
cv.imshow("image1",scr1) #顯示原圖3
cv.imshow("image2",scr2) #顯示原圖4
add_demo(scr1, scr2) #呼叫加法運算
subtract_demo(scr1, scr2) #呼叫減法運算
cv.waitKey(0)

影像直接的像素相加相減后合并成一張圖片
1.3ROI與填充
import cv2 as cv
import numpy as np
src = cv.imread('1.jpg') #讀取圖片
cv.imshow("input image", src) #顯示原圖片
face = src[250:450, 150:450] #選擇區域
gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY) #選擇區域灰度化
backface = cv.cvtColor(gray, cv.COLOR_GRAY2BGR) #將gray轉回BGR格式,因為下面圖片合并需要通道數一樣
src[250:450, 150:450] = backface #合并影像
cv.imshow('face',src) #顯示影像
cv.waitKey(0) #等待時間
def fill_color_demo(image): #定于彩色填充影像函式
copyImg = image.copy() #拷貝出新影像
h,w = image.shape[:2] #獲取長寬
mask = np.zeros([h+2, w+2], np.uint8) #創建mask大小,且必須是8位
cv.floodFill(copyImg, mask, (30,30), (0, 255, 255), (50,50,50),(50,50,50),cv.FLOODFILL_FIXED_RANGE)
#泛洪填充,第三個引數填充起始點,4重新填充像素值,5填充的最低像素范圍 6填充的最高范圍 7考慮當前像素與種子像素之差
cv.imshow("fill_color_demo", copyImg) #顯示圖片
src2 = cv.imread('1.jpg')
fill_color_demo(src2)
cv.waitKey(0)

選擇一個區域繼續顏色變化,或想PS油漆桶功能一樣點擊一個點進行泛宏填充,
1.4模糊與銳化操作
import cv2 as cv
import numpy as np
src = cv.imread('1.jpg') #匯入圖片
cv.imshow('1.jpg',src) #顯示原圖
def blur_demo(image): #定義模糊函式
dst = cv.blur(image,(15,15)) #水平和垂直方向各模糊15個單位
cv.imshow('blur_image',dst)
def custom_blur_demo(image): #自定義圖片卷積處理函式
kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]],np.float32) #定義3×3的卷積核
dst = cv.filter2D(image, -1, kernel=kernel) #呼叫卷積函式,第一個引數原圖片,第二引數目標影像所需深度,第三引數卷積核
cv.imshow('custom_blur_demo',dst) #顯示卷積后影像,卷積核的數不同效果不同,這里是銳化
blur_demo(src) #呼叫模糊函式
custom_blur_demo(src)
cv.waitKey(0)

圖片變模糊和圖片變銳化更加清晰
1.5邊緣保留濾波
import cv2 as cv
import numpy as np
src = cv.imread('5.jpg') #匯入圖片
cv.imshow('5.jpg',src) #顯示原圖
def bi_demo(image): #定義濾波函式
dst = cv.bilateralFilter(image,0,100, 15)
#呼叫雙邊濾波函式,第一個引數原圖,第二個引數每個像素直徑范圍,第三個引數融合周邊像素顏色,第四個引數相似顏色像素相互影響
cv.imshow('bi_demo', dst) #輸出濾波后影像
bi_demo(src)
cv.waitKey(0)

效果類似美顏
1.6影像二值化
import cv2 as cv
import numpy as np
src = cv.imread('1.jpg') #匯入圖片
cv.imshow('1.jpg',src) #顯示原圖
def threshold_demo(image): #定義二值化函式
gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) #圖片灰度化處理
ret,binary = cv.threshold(gray, 0, 255,cv.THRESH_BINARY|cv.THRESH_OTSU)
#呼叫二值化函式 第一個引數為輸入影像,第二引數為進行分類的像素,第三個引數表示閾值,第四引數表示運算方法
print("threshold value %s"%ret) #輸出劃分像素點
cv.imshow("binary",binary) #顯示影像
threshold_demo(src)
cv.waitKey(0)

1.7影像直方圖
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
src = cv.imread('1.jpg') #匯入圖片
cv.imshow('1.jpg',src) #顯示原圖
def plot_demo(image):
plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()是將多維陣列降為一維陣列,256為bins數量,[0, 256]為范圍,計算像素個數
plt.show()
def image_hist(image):
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
# 計算出直方圖,calcHist(images, channels, mask, histSize(有多少個bin), ranges[, hist[, accumulate]]) -> hist
# hist 是一個 256x1 的陣列,每一個值代表了與該灰度值對應的像素點數目,
hist = cv.calcHist(image, [i], None, [256], [0, 256])
print(hist.shape)
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
image_hist(src)
plot_demo(src)
cv.waitKey(0)

1.8繪制外輪廓
import cv2 as cv
import numpy as np
src = cv.imread('6.jpg') #匯入圖片
cv.imshow('6.jpg',src) #顯示原圖
def contours_demo(image): #定義輪廓發現函式
dst = cv.GaussianBlur(image, (3,3),0) #呼叫高斯模糊,第二個引數內核大小,第三個引數高斯核標準偏差
gray = cv.cvtColor(dst, cv.COLOR_BGR2GRAY) #影像灰度化
ret,binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY| cv.THRESH_OTSU) #影像二值化
cv.imshow("binary image", binary) #輸出影像
contours,heriachy = cv.findContours(binary,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#呼叫檢測物體輪廓函式,第一個引數尋找輪廓的影像,第二個引數表示輪廓的檢索模式,有 cv2.RETR_EXTERNAL表示只檢測外輪廓
# cv2.RETR_LIST檢測的輪廓不建立等級關系 cv2.RETR_CCOMP建立兩個等級的輪廓cv2.RETR_TREE建立一個等級樹結構的輪廓,
#第三個引數為輪廓的近似辦法,cv2.CHAIN_APPROX_SIMPLE壓縮各方向的元素
#最后回傳影像、輪廓資訊、層次資訊
for i ,contour in enumerate(contours):
cv.drawContours(image,contours,i,(0,0,255),2)
#第一個引數指在哪幅圖上繪制輪廓資訊,第二個引數是輪廓本身,第三個引數是指定繪制哪條輪廓
#第四個引數是繪圖的顏色,第五個引數是繪制的線寬 輸入-1則表示填充
print(i)
cv.imshow("detect contours",image)
contours_demo(src)
cv.waitKey(0)

1.9物件測量-目標面積計算
import cv2 as cv
import numpy as np
src = cv.imread('8.jpg') #匯入圖片
cv.imshow('8.jpg',src) #顯示原圖
def measure_object(image): #定義測量函式
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #影像灰度化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) # 影像二值化 cv.THRESH_BINARY_INV是取反
print("threshold value:%s"%ret) #輸出閾值
cv.imshow("binary image", binary) # 輸出影像
contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
# 呼叫檢測物體輪廓函式
for i ,contour in enumerate(contours):
area = cv.contourArea(contour) #求取面積
x, y, w, h = cv.boundingRect(contour) #輪廓外接矩形
mm = cv.moments(contour) #計算影像中心矩
rate = min(w, h)/max(w, h) #計算寬高比
print('rectangle rate:%s'%rate) #輸出寬高比
cx = mm['m10']/mm['m00']
cy = mm['m01']/mm['m00'] #找出輪廓的中心位置
cv.circle(image, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
# 用個黃色小圓圈把幾何圖形的中心位置繪制出來, 第三個引數是半徑,第四個引數是顏色
cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
#用紅色框框把外接矩形繪制出來
print("contour area %s"%area)
cv.imshow("detect contours", image)
measure_object(src)
cv.waitKey(0)

1.10區分指定外輪廓
import cv2 as cv
import numpy as np
src = cv.imread('7.jpg')
cv.imshow('7.jpg',src)
def measure_object(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
print("threshold value:%s"%ret)
cv.imshow("binary image", binary)
dst = cv.cvtColor(binary,cv.COLOR_GRAY2BGR) #'''還原三通道圖片'''
contours, heriachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
for i ,contour in enumerate(contours):
area = cv.contourArea(contour)
x, y, w, h = cv.boundingRect(contour)
mm = cv.moments(contour)
rate = min(w, h)/max(w, h)
print('rectangle rate:%s'%rate)
cx = mm['m10']/mm['m00']
cy = mm['m01']/mm['m00']
cv.circle(dst, (np.int(cx), np.int(cy)), 3, (0, 255, 255), -1)
approxCurve = cv.approxPolyDP(contour,4,True)
#'''呼叫固定邊數精度函式 第二引數指定原始曲線與近似曲線之間最大距離精度 第三引數近似曲線閉合'''
print(approxCurve.shape)
if approxCurve.shape[0] > 4: # '''判斷圖形邊數是否大于4'''
cv.drawContours(dst, contours, i, (0,255,0),2) #'''將符合要求的用綠色輪廓輸出'''
print("contour area %s"%area)
cv.imshow("detect contours", dst)
measure_object(src)
cv.waitKey(0)

1.11腐蝕與膨脹
import cv2 as cv
import numpy as np
src = cv.imread('9.jpg') #匯入圖片
cv.imshow('9.jpg',src) #顯示原圖
def erode_demo(image): #定義腐蝕函式
print(image.shape) #顯示圖片格式
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #影像灰度化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #二值化
cv.imshow("binary",binary) #顯示二值化后的圖片
kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,8))
#建立指定結構 第一個引數定義形狀,這里是方形,第二個引數指定程度
dst = cv.erode(binary,kernel) #腐蝕
cv.imshow("erode_demo", dst) #輸出影像
def erode_dilate(image): #定義膨脹函式
print(image.shape)
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("binary",binary)
kernel = cv.getStructuringElement(cv.MORPH_RECT,(8,8))
dst = cv.dilate(binary,kernel) #膨脹
cv.imshow("erode_dilate", dst)
erode_dilate(src)
erode_demo(src)
cv.waitKey(0)

1.12開閉操作
#先腐蝕再膨脹就是開操作,先膨脹再腐蝕就是閉操作
import cv2 as cv
import numpy as np
src = cv.imread('10.jpg') #匯入圖片
cv.imshow('10.jpg',src) #顯示原圖
def open_demo(image): #自定義開操作函式
print(image.shape) #顯示圖片格式
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #影像灰度化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 二值化
cv.imshow("binary", binary) # 顯示二值化后的圖片
kernel = cv.getStructuringElement(cv.MORPH_RECT, (6, 6))
# 建立指定結構 第一個引數定義形狀,這里是方形,第二個引數指定程度
binary = cv.morphologyEx(binary, cv.MORPH_OPEN,kernel)
#進行形態學操作,引數1傳入圖片,引數2進行開運算,引數3表示方框大小
cv.imshow('open-result',binary)
def close_demo(image): #自定義閉操作函式
print(image.shape) #顯示圖片格式
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #影像灰度化
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 二值化
cv.imshow("binary", binary) # 顯示二值化后的圖片
kernel = cv.getStructuringElement(cv.MORPH_RECT, (10, 10))
# 建立指定結構 第一個引數定義形狀,這里是方形,第二個引數指定程度
binary = cv.morphologyEx(binary, cv.MORPH_CLOSE,kernel) #引數2改成閉操作運算
cv.imshow('close-result',binary)
open_demo(src)
close_demo(src)
cv.waitKey(0)

以上opencv-python的基本操作代碼更新完畢,下一章更新使用opencv-python進行人臉檢測,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290983.html
標籤:其他
上一篇:【OpenCV】利用Flask+Python+OpenCV實作攝像頭讀取影像幀網頁視頻流
下一篇:復習Java網路編程.NET包&Java面試題Redis哨兵模式&生活【記錄一個咸魚大學生三個月的奮進生活】022
