<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
影象分割是許多計算機視覺應用中的關鍵處理步驟,通常用於將影象劃分為不同的區域,這些區域常常對應於真實世界的物件。因此,影象分割是影象識別和內容分析的重要步驟。影象閾值是一種簡單、有效的影象分割方法,其中畫素根據其強度值進行分割區。在本文中,將介紹 OpenCV
所提供的主要閾值技術,可以將這些技術用作計算機視覺應用程式中影象分割的關鍵部分。
閾值處理是一種簡單、有效的將影象劃分為前景和背景的方法。影象分割通常用於根據物件的某些屬性(例如,顏色、邊緣或直方圖)從背景中提取物件。最簡單的閾值方法會利用預定義常數(閾值),如果畫素強度小於閾值,則用黑色畫素替換,如果畫素強度大於閾值,則用白色畫素替換。OpenCV 提供了 cv2.threshold()
函數來對影象進行閾值處理。
為了測試 cv2.threshold()
函數,首次建立測試影象,其包含一些填充了不同的灰色調的大小相同的區域,利用 build_sample_image()
函數構建此測試影象:
def build_sample_image(): """建立填充了不同的灰色調的大小相同的區域,作為測試影象""" # 定義不同區域 tones = np.arange(start=50, stop=300, step=50) # 初始化 result = np.zeros((50, 50, 3), dtype="uint8") for tone in tones: img = np.ones((50, 50, 3), dtype="uint8") * tone # 沿軸連線陣列 result = np.concatenate((result, img), axis=1) return result
接下來將使用不同的預定義閾值: 0 、 50 、 100 、 150 、 200 和 250 呼叫 cv2.threshold()
函數,以檢視不同預定義閾值對閾值影象影響。例如,使用閾值 thresh = 50
對影象進行閾值處理:
ret1, thresh1 = cv2.threshold(gray_image, 50, 255, cv2.THRESH_BINARY)
其中,thresh1
是僅包含黑白色的閾值影象。源影象 gray_image
中灰色強度小於 50 的畫素為黑色,強度大於 50 的畫素為白色。
使用多個不同閾值對影象進行閾值處理:
# 視覺化函數 def show_img_with_matplotlib(color_img, title, pos): img_RGB = color_img[:, :, ::-1] ax = plt.subplot(7, 1, pos) plt.imshow(img_RGB) plt.title(title, fontsize=8) plt.axis('off') # 使用 build_sample_image() 函數構建測試影象 image = build_sample_image() gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) for i in range(6): # 使用多個不同閾值對影象進行閾值處理 ret, thresh = cv2.threshold(gray_image, 50 * i, 255, cv2.THRESH_BINARY) # 視覺化 show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(i * 50), i + 2) # 視覺化測試影象 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img with tones of gray - left to right: (0,50,100,150,200,250)", 1) # 影象進行閾值處理後,常見的輸出是黑白影象 # 因此,為了更好的視覺化效果,修改背景顏色 fig.patch.set_facecolor('silver') plt.show()
從上圖可以看出,根據閾值和樣本影象灰度值的不同,閾值處理後生成的黑白影象的變化情況。
上一節中,我們已經簡單介紹過了 OpenCV
中提供的簡單閾值處理常式——cv2.threshold()
,該函數用法如下:
cv2.threshold(src, thresh, maxval, type, dst=None) -> retval, dst
cv2.threshold()
函數對 src
輸入陣列(可以為單通道或多通道影象)應用預定義常數 thresh
設定的閾值;type
引數用於設定閾值型別,閾值型別的可選值如下:cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
、cv2.THRESH_TOZERO_INV
、cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
。
maxval
引數用於設定最大值,其僅在閾值型別為 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
時有效;需要注意的是,在閾值型別為 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
時,輸入影象 src
應為為單通道。
為了更好的瞭解閾值操作的不同型別,接下來給出每種閾值型別的具體公式。符號說明:src
是源(原始)影象,dst
對應於閾值化後的目標(結果)影象,因此,src(x, y)
對應於源影象畫素 (x, y)
處的強度,而 dst(x, y)
對應於目標影象畫素 (x, y)
處的強度。
閾值型別 cv2.THRESH_BINARY
公式如下:
其表示,如果畫素 src(x, y)
的強度高於 thresh
,則目標影象畫素強度 dst(x,y)
將被設為 maxval
;否則,設為 0
。
閾值型別 cv2.THRESH_BINARY_INV
公式如下:
其表示,如果畫素 src(x, y)
的強度高於 thresh
,則目標影象畫素強度 dst(x,y)
將被設為 0
;否則,設為 maxval
。
閾值型別 cv2.THRESH_TRUNC
公式如下:
其表示,如果畫素 src(x, y)
的強度高於 thresh
,則目標影象畫素強度設定為 threshold
;否則,設為 src(x, y)
。
閾值型別 cv2.THRESH_TOZERO
公式如下:
其表示,如果畫素 src(x, y)
的強度高於 thresh
,則目標影象畫素值將設定為 src(x, y)
;否則,設定為 0
。
閾值型別 cv2.THRESH_TOZERO_INV
公式如下:
其表示,如果畫素 src(x, y)
的強度大於 thresh
,則目標影象畫素值將設定為 0
;否則,設定為 src(x, y)
。
而 cv2.THRESH_OTSU
和 cv2.THRESH_TRIANGLE
屬於特殊的閾值型別,它們可以與上述閾值型別( cv2.THRESH_BINARY
、cv2.THRESH_BINARY_INV
、cv2.THRESH_TRUNC
、cv2.THRESH_TOZERO
和 cv2.THRESH_TOZERO_INV
)進行組合。組合後,閾值處理常式 cv2.threshold()
將只能處理單通道影象,且計算並返回最佳閾值,而非指定閾值。
接下來使用不同閾值型別對同樣的測試影象進行閾值處理,觀察不同閾值處理效果:
ret1, thresh1 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY) ret2, thresh2 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY) ret3, thresh3 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY_INV) ret4, thresh4 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY_INV) ret5, thresh5 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TRUNC) ret6, thresh6 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TOZERO) ret7, thresh7 = cv2.threshold(gray_image,100,255, cv2.THRESH_TOZERO_INV) # 視覺化 show_img_with_matplotlib(cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 255", 2) show_img_with_matplotlib(cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 220", 3) show_img_with_matplotlib(cv2.cvtColor(thresh3, cv2.COLOR_GRAY2BGR), "THRESH_BINARY_INV - thresh = 100", 4) # 其他影象視覺化方法類似,不再贅述 # ...
如上圖所示,maxval
引數僅在使用 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
閾值型別時有效,上例中將 cv2.THRESH_BINARY
和 cv2.THRESH_BINARY_INV
型別的 maxval
值設定為 255
及 220
,以便檢視閾值影象在這兩種情況下的變化情況。
瞭解 cv2.threshold()
不同引數的工作原理後,我們將 cv2.threshold()
應用於真實影象,並使用不同的閾值:
# 載入影象 image = cv2.imread('example.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 繪製灰度影象 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img", 1) # 使用不同的閾值呼叫 cv2.threshold() 並進行視覺化 for i in range(8): ret, thresh = cv2.threshold(gray_image, 130 + i * 10, 255, cv2.THRESH_BINARY) show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(130 + i * 10), i + 2)
以上就是Python OpenCV閾值處理詳解的詳細內容,更多關於OpenCV閾值處理的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45