日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化

發(fā)布時間:2024/9/30 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎版筆記鏈接:
python3+opencv學習筆記匯總目錄(適合基礎入門學習)
進階版筆記目錄鏈接:
python+opencv進階版學習筆記目錄(適合有一定基礎)

基礎版二值化講解
opencv學習筆記10:閾值分割

圖像二值化原理

二值化方法:全局閾值,局部閾值
具體原理見上面鏈接

圖像二值化實現

1.全局閾值
通常情況,我們一般不知道設定怎樣的閾值thresh才能得到比較好的二值化效果,只能去試。如對于一幅雙峰圖像(理解為圖像直方圖中存在兩個峰),我們指定的閾值應盡量在兩個峰之間的峰谷。這時,就可以用第四個參數THRESH_OTSU,它對一幅雙峰圖像自動根據其直方圖計算出合適的閾值(對于非雙峰圖,這種方法得到的結果可能不理想)。

對于雙峰圖,我們需要多傳入一個參數cv2.THRESH_OTSU,并且把閾值thresh設為0,設置為其他數也默認為0,算法會找到最優(yōu)閾值,并作為第一個返回值ret返回。

cv2.THRESH_BINARY:二進制閾值。把亮的處理成白色,暗的處理成黑色

cv2.THRESH_BINARY_INV:反二進制閾值。把亮的處理成黑色,暗的處理成白色
cv2.THRESH_TRUNC:截斷閾值。亮的不能太亮,有上限,暗的不變
cv2.THRESH_TOZERO_INV:threshold 反閾值化為0,把比較亮的部分處理成0成黑色,小于等于閾值的像素點不變
cv2.THRESH_TOZERO:threshold 閾值化為0,比較亮的部分不變,比較暗的部分處理成黑色為0

import cv2 as cv import numpy as npdef threshold_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY|cv.THRESH_OTSU)print("threshold value %s"%ret)cv.imshow("binary", binary)print("--------- Python OpenCV Tutorial ---------") src = cv.imread("duoren.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) threshold_demo(src) cv.waitKey(0) cv.destroyAllWindows()

圖像直方圖

該圖沒有明顯兩個波峰,將就用

結果

二進制閾值

修改cv.THRESH_BINARY為其他參數。結果如下

cv2.THRESH_BINARY_INV:反二進制閾值

cv2.THRESH_TRUNC:截斷閾值

cv2.THRESH_TOZERO_INV: 反閾值化為0

cv2.THRESH_TOZERO:閾值化為0

2.局部閾值 自適應閾值
cv2.adaptiveThreshold()

ADAPTIVE_THRESH_MEAN_C :把圖像分成一個個小的區(qū)域,每個區(qū)域做閾值處理,每個區(qū)域閾值為這個區(qū)域的均值減去常量c,大于閾值取白色,小于取黑色。整個圖像有很多閾值。

ADAPTIVE_THRESH_GAUSSIAN_C:把圖像分成一個個小的區(qū)域,閾值是每個區(qū)域均值的權重和(均值分布為高斯分布,越接近中心均值權重越高)再減去常量c,整個圖像只有一個閾值
blocksize:區(qū)域大小,必須是奇數。
C: 二值化時,如何一個像素點減去均值大于C,才把這個點設為白色,能減弱噪聲影響。等于說閾值=均值-C

import cv2 as cv import numpy as npdef local_threshold(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)cv.imshow("binary", binary) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("duoren.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) local_threshold(src) cv.waitKey(0) cv.destroyAllWindows()

換一張經典圖
自適應閾值結果

全局閾值結果

首先還是自適應閾值吧。

3.自定義閾值
自己實現一個二值化處理

import cv2 as cv import numpy as npdef custom_threshold(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#轉換為灰度圖h, w = gray.shape[:2]#高寬m = np.reshape(gray, [1, w*h])#將圖像轉換為1維數組,1行多列mean = m.sum() / (w*h)#求均值,把均值作為閾值print("mean : ", mean)ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)cv.imshow("binary", binary)print("--------- Python OpenCV Tutorial ---------") src = cv.imread("duoren.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) custom_threshold(src) cv.waitKey(0) cv.destroyAllWindows()

超大圖像二值化

方法:圖像分塊,再分別閾值
圖超大時,由于光照不能很好分布全圖,所以有很多噪聲。

import cv2 as cv import numpy as npdef big_image_binary(image):print(image.shape)#(1200, 1920, 3)cw = 256#每個小塊寬ch = 256#每個小塊高h, w = image.shape[:2]#整個圖像高,寬gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)#轉灰度圖for row in range(0, h, ch):#遍歷每一小塊高for col in range(0, w, cw):#遍歷每一塊寬roi = gray[row:row+ch, col:cw+col]#小塊區(qū)域#print(np.std(roi), np.mean(roi))#打印小塊方差,均值dev = np.std(roi)if dev < 15:gray[row:row + ch, col:cw + col] = 255#去除空白區(qū)域的噪點else:#全局閾值ret, dst = cv.threshold(roi, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#cv.THRESH_OTSU自動尋找閾值#自適應閾值#dst = cv.adaptiveThreshold(roi, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)gray[row:row + ch, col:cw + col] = dst#在原圖上替換小塊二值化結果#cv.imwrite("result_binary.png", gray)cv.imshow('result_binary',gray) print("--------- Python OpenCV Tutorial ---------") src = cv.imread("limi.jpg") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) big_image_binary(src) cv.waitKey(0) cv.destroyAllWindows()

說明
下面代碼是去除圖像空白小塊區(qū)域噪聲。如果一個小塊沒有其他東西,那么它的方差就很小,去除一些小黑點(去噪)

if dev < 15:gray[row:row + ch, col:cw + col] = 255#去除空白區(qū)域的噪點

電氣專業(yè)的計算機萌新,寫博文不容易。如果你覺得本文對你有用,請點個贊支持下。謝謝。

總結

以上是生活随笔為你收集整理的opencv进阶学习9:图像阈值大全,图像二值化,超大图像二值化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。