OpenCVの-python-研究では、10(画像しきい値を)ノート

単純なしきい値

画素毎に同じ閾値を適用しています。画素値が閾値未満である場合、それは0に設定され、そうでない場合は、最大値に設定されています。cv.thresholdの関数がしきい値を設定するために使用され、その最初のパラメータは、ソース画像がグレースケール画像であり、第二のパラメータはピクセルを分類するための閾値であり、画素は、第3のパラメータ値であるに割り当てられた閾値を超え最大。OpenCVのがしきい値の異なるタイプを提供し、閾値を第四パラメータ型の関数で与えられます。

機能:

RETVAL、DST = cv.threshold(SRC、THRESH、MAXVAL、タイプ〔、DST])画素毎に固定された閾値を用いて

パラメータ:

SRC       入力画像、グレースケール(マルチチャネル、8ビットまたは32ビット浮動小数点)。
DST Srcおよびチャネルの出力配列の同じサイズ、タイプ、および数を有します。
脱穀 しきい値                                                                                  
MAXVAL 画素値が閾値(又は種類に応じて決定された閾値未満)を超える場合、値が与えられました
タイプ しきい値のタイプ(参照  ThresholdTypesを)。

戻り値:

 RETVAL:使用されるしきい値は、大津のに使用されます

 DST:画像を閾値処理されます

しきい値タイプ:

例えば:

インポートのCVとしてCV2
 インポートNPとしてnumpyの
 から matplotlibのインポートPLTのようpyplot 
IMG = cv.imread(' 4.JPG ' 、0)
RET、THRESH1 = cv.threshold(IMG、127、255 、cv.THRESH_BINARY)
RET、THRESH2 = cv.threshold(IMG、127、255 、cv.THRESH_BINARY_INV)
RET、thresh3 = cv.threshold(IMG、127、255 、cv.THRESH_TRUNC)
RET、thresh4 = cv.threshold(IMG、127、255 、cv.THRESH_TOZERO)
RET、thresh5 = cv.threshold(IMG、127、255 、cv.THRESH_TOZERO_INV)
タイトル = [ '原画像' ' BINARY ' ' BINARY_INV ' ' TRUNC ' ' TOZERO ' ' TOZERO_INV ' ] 
画像 = [IMG、THRESH1、THRESH2、thresh3、thresh4、thresh5]
 用の I における範囲(6 ):
    plt.subplot ( 2、3、I + 1)、plt.imshow(画像[i]は、' 灰色' 
    plt.title(タイトル[i])と
    plt.xticks([])、plt.yticks([])
plt.show ()

 

適応しきい値

在上一节中,我们使用一个全局值作为阈值。但这并不适用于所有情况,例如,如果一张图像在不同的区域有不同的光照条件。在这种情况下,自适应阈值阈值可以提供帮助,算法会根据像素周围的小区域来确定像素的阈值。因此,对于同一幅图像的不同区域,我们得到了不同的阈值,对于光照不同的图像,我们得到了更好的结果。除了上述所描述的区域外,cv.adaptiveThreshold函数还需要3个其它参数。


函数

dst=cv.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])

参数:

src 源 8-bit 单通道图像
dst 与源图像具有相同大小和类型的目标图像
maxValue 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
adaptiveMethod 阈值的计算方法,包含以下2种类型: see AdaptiveThresholdTypes.
thresholdType 阈值类型必须是 THRESH_BINARY or THRESH_BINARY_INV
blockSize 像素邻域的大小,用来计算像素的阈值: 3, 5, 7, and so on.
C 阈值计算方法中的常数项                                                                                                                    

上述参数中,adaptiveMethod决定了阈值是如何计算的

  cv.ADAPTIVE_THRESH_MEAN_C: 阈值是邻域面积减去常数C的平均值。

  cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域值减去常数C的高斯加权和,权重为一个高斯窗口

blockSize大小决定了邻域的大小,C是从邻域像素的均值或加权和中减去的常数。

举例

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('2.png',0)
# 中值滤波,抑制图像噪声。在滤除噪声的同时,能够保护信号的边缘,使之不被模糊
img = cv.medianBlur(img,5)
# 简单阈值
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# 自适应阈值
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,\
            cv.THRESH_BINARY,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv.THRESH_BINARY,11,2)
titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in range(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

 

 

Otsu's二值化

在全局阈值化中,我们使用一个任意选择的值作为阈值。相反,Otsu的方法避免了必须选择一个值并自动确定它。

Otsu’s Binarization是一种基于直方图的二值化方法,它需要和threshold函数配合使用。

考虑只有两个不同图像值的图像(双峰图像),其中直方图只包含两个峰值。一个好的阈值应该位于这两个值的中间(对于非双峰图像,这种方法 得到的结果可能会不理想)。同样,Otsu的方法从图像直方图中确定一个最优的全局阈值。

为此,使用 cv.threshold()函数, cv.THRESH_OTSU 最为一个额外的标志传入。阈值可以任意选择。然后,该算法找找出一个最优阈值最为第一个输出。

看一下下边的例子。输入图像是一个有噪声的图像,在第一种情况下,应用值为127的全局阈值。在第二种情况下,直接应用Otsu的阈值。在第三种情况下,首先用5x5高斯核对图像进行滤波,去除噪声,然后应用Otsu阈值。看看噪声滤波如何改进结果。

 

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('noisy2.png',0)
# global thresholding
ret1,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv.threshold(img,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv.GaussianBlur(img,(5,5),0)
# 阈值一定要设为0 ret3,th3
= cv.threshold(blur,0,255,cv.THRESH_BINARY+cv.THRESH_OTSU) # plot all the images and their histograms images = [img, 0, th1, img, 0, th2, blur, 0, th3] titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"] for i in xrange(3): plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray') plt.title(titles[i*3]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256) plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([]) plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray') plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([]) plt.show()

 

大津手順: 
1.計算画像ヒストグラム; 
2.別のグループに閾値、画素群に閾値よりも大きい強度のヒストグラム、閾値以下の画素を設定する; 
3.二つのグループのオフセットの数を計算しますオフセットデータが追加され、 
4 0〜255の閾値の大きい順に応じて、オフセットの最小数まで、ステップ1-3を繰り返す、それが閾値の結果に対応する値です。

おすすめ

転載: www.cnblogs.com/blog-xyy/p/11246627.html