OpenCV Python入門教程實際操作:圖像閾值
在本教程中,我們將介紹圖像和視頻分析的閾值。閾值的想法是進一步簡化可視數(shù)據(jù)以進行分析。首先,您可以轉(zhuǎn)換為灰度,但隨后必須考慮到灰度仍然至少具有255個值。最基本的閾值功能是根據(jù)閾值將所有內(nèi)容轉(zhuǎn)換為白色或黑色。假設(shè)我們希望閾值為125(總共255),然后將125以下的所有內(nèi)容轉(zhuǎn)換為0或黑色,將125以上的所有內(nèi)容轉(zhuǎn)換為255或白色。如果像平常一樣轉(zhuǎn)換為灰度,則將得到白色和黑色。如果不轉(zhuǎn)換為灰度,則將獲得帶閾值的圖片,但會有顏色。
盡管這聽起來足夠好,但事實并非如此。我們將在此處介紹多個示例和不同類型的閾值說明。我們將使用以下圖像作為示例圖像,但是可以使用自己的圖像:
本書中的簡短內(nèi)容是一個很好的例子,首先,背景實際上根本沒有白色,一切都是暗淡的,但是一切都是變化的。有些部分很輕,很容易閱讀,而另一些則很暗,需要聚焦很多。首先,讓我們嘗試一個簡單的閾值:
retval, threshold = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY)
二進制閾值是一個簡單的“或”閾值,其中像素為255或0。在許多情況下,該閾值為白色或黑色,但是我們現(xiàn)在將圖像保留為彩色,因此可能仍為彩色。這里的第一個參數(shù)是圖像。下一個參數(shù)是閾值,我們選擇10。下一個是最大值,我們將其選擇為255。接下來,最后是閾值類型,我們將其選擇為THRESH_BINARY。通常,選擇閾值10會有些困難。我們選擇10,因為這是低光圖片,所以我們選擇低數(shù)字。通常,大約125-150的效果最好。
- import cv2
- import numpy as np
- img = cv2.imread('linuxidc.com.jpg')
- retval, threshold = cv2.threshold(img, 12, 255, cv2.THRESH_BINARY)
- cv2.imshow('original',img)
- cv2.imshow('threshold',threshold)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
結(jié)果:
現(xiàn)在,圖像的讀取效果稍好一些,但仍然有些混亂。從視覺上看,它是更好的方法,但是使用程序來分析它仍然很困難。讓我們看看是否可以進一步簡化它。
首先,讓我們對圖像進行灰度處理,然后設(shè)置閾值:
- import cv2
- import numpy as np
- grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- retval, threshold = cv2.threshold(grayscaled, 10, 255, cv2.THRESH_BINARY)
- cv2.imshow('original',img)
- cv2.imshow('threshold',threshold)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
結(jié)果如下:
是的,更簡單,但是我們在這里仍然缺少很多上下文。接下來,我們可以嘗試自適應閾值,它將嘗試改變閾值,并希望解決彎曲的頁面。
- import cv2
- import numpy as np
- img = cv2.imread('www.linuxidc.com.jpg')
- grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- th = cv2.adaptiveThreshold(grayscaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 115, 1)
- cv2.imshow('original',img)
- cv2.imshow('Adaptive threshold',th)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
結(jié)果如下:
還有一個可以執(zhí)行的閾值版本,稱為Otsu閾值(大津閾值)。它在這里不能很好地發(fā)揮左右,但是:
- import cv2
- import numpy as np
- img = cv2.imread('1.jpg')
- grayscaled = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
- retval2,threshold2 = cv2.threshold(grayscaled,125,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
- cv2.imshow('original',img)
- cv2.imshow('Otsu threshold',threshold2)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
結(jié)果如下: