BGR與RGB
? ? ? ? OpenCV在讀取圖像時,默認的顏色空間是BGR(藍綠紅),而在大多數其他的圖像處理庫和圖像格式中,使用的顏色空間是RGB(紅綠藍)。因此,當你需要使用OpenCV處理圖像,然后將處理結果傳遞給其他庫(如matplotlib、PIL等)進行進一步處理或顯示時,你需要將顏色空間從BGR轉換為RGB。
? ? ? ? 例如,如果你想使用matplotlib來顯示一個由OpenCV處理過的圖像,你需要先將顏色空間從BGR轉換為RGB,否則圖像的顏色會顯示錯誤。
import cv2
from matplotlib import pyplot as plt
# 使用OpenCV讀取圖像
image = cv2.imread('image.jpg')
# 使用OpenCV處理圖像(例如,進行邊緣檢測、特征提取等)
# 將顏色空間從BGR轉換為RGB
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 使用matplotlib顯示圖像
plt.imshow(image)
plt.show()
? ? ? ? 在這個例子中,如果不進行顏色空間的轉換,那么matplotlib顯示的圖像顏色會與原圖不同,因為matplotlib默認的顏色空間是RGB,而OpenCV的是BGR。
Canny邊緣檢測
? ? ? ? 邊緣檢測有很多種方法,包括Sobel、Scharr、Laplacian、Prewitt和Canny等
? ? ? ? Canny邊緣檢測的特點:
-
效果好:Canny邊緣檢測是一種非常流行的邊緣檢測方法,它能夠很好地檢測出圖像的邊緣,而且邊緣連續(xù),幾乎沒有斷裂。
-
噪聲抑制:Canny邊緣檢測在進行邊緣檢測之前,會先使用高斯濾波器對圖像進行平滑處理,以消除圖像中的噪聲。這使得Canny邊緣檢測對噪聲的抵抗能力比其他邊緣檢測方法更強。
-
雙閾值檢測:Canny邊緣檢測使用了雙閾值檢測來確定邊緣,這可以有效地消除了因噪聲或其他因素造成的虛假邊緣。
-
易于使用:Canny邊緣檢測在OpenCV中的實現非常簡單,只需要一行代碼就可以完成。
? ? ? ? 這種方法因為其效果好、抗噪聲能力強、易于使用等優(yōu)點,所以被廣泛應用于圖像處理中的邊緣檢測任務。
基礎用法
-
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
? ? ? ? 這行代碼將圖像從顏色空間轉換為灰度空間。在灰度空間中,圖像的每個像素只有一個強度值,而不是顏色空間中的三個。這樣可以簡化后續(xù)的邊緣檢測操作,因為我們只需要處理一個通道的數據。
-
edges = cv2.Canny(gray, threshold1=30, threshold2=100)
? ? ? ? 這行代碼使用Canny邊緣檢測算法找出圖像中的邊緣。Canny算法是一種非常流行的邊緣檢測算法,它使用兩個閾值(在這里是30和100)來檢測強度變化較大的區(qū)域,這些區(qū)域通常對應于物體的邊緣。
-
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
? ? ? ? 這行代碼使用
findContours
函數找出圖像中的輪廓。輪廓可以被視為連接所有連續(xù)邊緣的曲線。在這里,cv2.RETR_EXTERNAL
表示只檢測外輪廓,cv2.CHAIN_APPROX_SIMPLE
表示對輪廓點進行壓縮,例如,對于一條直線輪廓,只需要存儲該直線的起始點和結束點。? ? ? ?
findContours
函數返回兩個值:第一個是一個列表,其中每個元素都是一個輪廓(輪廓本身也是一個列表,包含輪廓上的點);第二個是輪廓的層次信息,但在這里我們不需要它,所以用_
忽略了。
? ? ? ? 總的來說,這三行代碼的目的是將圖像轉換為灰度,然后使用Canny算法找出邊緣,最后找出邊緣形成的輪廓。
Canny的閾值如何調節(jié)
? ? ? ? 在Canny邊緣檢測算法中,30和100是兩個閾值,它們用于確定邊緣。這兩個閾值定義了邊緣檢測的強度:
-
threshold1
:最小值閾值。低于此閾值的邊緣會被忽略。 -
threshold2
:最大值閾值。高于此閾值的邊緣會被認為是真正的邊緣。
? ? ? ? 這兩個閾值之間的邊緣則根據其連通性來決定。如果這些邊緣與某個“確定邊緣”(即強度超過threshold2
的邊緣)相連,則它們被認為是邊緣的一部分,否則它們會被丟棄。
? ? ? ? 改變這兩個值會影響邊緣檢測的結果:
- 如果你降低
threshold1
或提高threshold2
,將會檢測到更少的邊緣,因為只有強度更高的邊緣才會被檢測到。 - 如果你提高
threshold1
或降低threshold2
,將會檢測到更多的邊緣,因為強度較低的邊緣也會被檢測到。
? ? ? ? 選擇合適的閾值是很重要的,因為它會直接影響到邊緣檢測的效果。通常,threshold2
的值應該是threshold1
的值的2到3倍。
在所有輪廓中找出最大輪廓
contour = sorted(contours, key=cv2.contourArea, reverse=True)[0]
? ? ? ? contours
是一個列表,其中每個元素都是一個輪廓。輪廓本身是一個由點組成的列表,這些點定義了輪廓的形狀。
? ? ? ? sorted
函數用于對列表進行排序。在這里,它對contours
列表進行排序。
? ? ? ? key=cv2.contourArea
參數指定了排序的依據。cv2.contourArea
是一個函數,它計算一個輪廓的面積。所以,這里的排序依據是輪廓的面積。
? ? ? ? reverse=True
參數指定了排序的方向。如果reverse=True
,那么列表會按照降序排序,也就是說,面積最大的輪廓會排在最前面。
? ? ? ? [0]
是一個索引操作,它取出排序后的列表中的第一個元素。因為我們按照面積進行了降序排序,所以第一個元素就是面積最大的輪廓。文章來源:http://www.zghlxwxcb.cn/news/detail-831320.html
? ? ? ? 所以,這行代碼的意思是:按照面積對所有檢測到的輪廓進行降序排序,然后取出面積最大的一個。文章來源地址http://www.zghlxwxcb.cn/news/detail-831320.html
到了這里,關于Python OpenCV 牛刀小試(練習)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!