今日、画像しきい値セグメンテーションを実装する場合、背景とオブジェクトを区別できるグレーしきい値を見つける必要があります。これは、処理された画像が比較的単純であり、そのヒストグラムに非常に明白な特徴があるためです。つまり、ヒストグラムが二重になっているためです。ピークと谷の形で表され、オブジェクトと背景を区別するしきい値は、谷に対応するしきい値でもあります.数学的な概念を使用して説明すると、二重のピークは2つの最大値に対応し、谷は最小値, つまり, 2 つの最大値の間の最小値を見つける. もちろん, 画像のグレー値の分布を数えることでグレー値の分布を視覚化し、適切なしきい値を見つけることもできます.最小値を見つけるためのソート. 効率ははるかに高速です. ここでは、グレー分布を視覚化する3つの方法を紹介します.
方法 1 - matplotlib ライブラリの hist() 関数を使用する
matplotlib.pyplot.hist( x、 bins=None、 range=None、 density=False、 weights=None、 cumulative=False、 bottom=None、 histtype='bar'、 align='mid'、 orientation='vertical'、 rwidth=None、 log=False、 color=None、 label=None、 stacked=False、 *、 data=None、 **kwargs )
通常、最初の 3 つのパラメーターのみが定義されます。
x: 入力データ
bins: bins 入力が整数の場合、出力画像で横座標が分割される部分の数を表します
range: 横座標の範囲を定義します。入力は 2 つの数値を格納するリストです。左側の数値は横座標の開始点、右側の数値は横座標のカットオフ ポイントです。
この関数出力の最終結果は、各グレー値とそれに対応する周波数を示す連続グラフです。
方法 2 - opencv で calcHist 関数を使用する
cv.calcHist(画像、チャンネル、マスク、ヒストサイズ、範囲[、ヒスト[、蓄積]])
画像: グレー値の分布をカウントする必要がある画像。血まみれの教訓があります。画像は [] で囲まれている必要があります。
チャンネル: 画像チャンネル、BGR 画像の場合、[0]、[1]、[2] は B、G、R の 3 つのチャンネルにそれぞれ
mask: 通常、デフォルトでは None です
histSize: ヒストグラムの横座標範囲を定義します
範囲: 横座標を分割する部分の数を定義します
方法 3——視覚的な描画に PLotly を使用する
Plotly によって生成されたグラフはインタラクティブです。つまり、マウスを対応するグレー値に合わせると、グレー値の頻度が直接表示されますが、グラフによって計算する必要があるため、時間がかかります。プログラム 各グレー値に対応する周波数は何ですか。
主にここで使用されます:
入力データの水平座標と垂直座標を格納するバー関数
関数のタイトル、水平および垂直座標を定義するために使用されるレイアウト関数
offline.plot、最終プロット
3 つの方法の実現プロセスの一般的な手順は次のとおりです。
import cv2
import matplotlib.pyplot as plt
from plotly import offline
from plotly.graph_objs import Bar, Layout
img_source = cv2.imread('C:\\Users\\yu\\Desktop\\picture_csdn\\cells_segmentation.jpg', cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img_source, cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray', img_gray)
# 方法二————利用opencv中的calcHist函数
img_hist = cv2.calcHist([img_gray], [0], None, [256], [0, 256])
plt.plot(img_hist, color='blue')
plt.show()
# 方法一————利用matplotlib库中的hist()函数
plt.hist(img_gray.ravel(), 256, [0, 256])#ravel函数功能是将多维数组降为一维数组
plt.show()
ret, img_segmentation = cv2.threshold(img_gray, 80, 255, cv2.THRESH_TRUNC)# 对图像进行阈值分割
cv2.imshow('img_segmentation', img_segmentation)# 图像分割结果
# 方法三————利用PLotly进行可视化绘图
a_input = list(img_gray.ravel())
frequencies = []
for value in list(range(0, 256)):
print(value)
frequency = a_input.count(value)
frequencies.append(frequency)
# 对结果可视化
x_values = list(range(0, 256))
data = [Bar(x=x_values, y=frequencies)]
x_axis_config = {'title': '灰度值'}
y_axis_config = {'title': '灰度值的频率'}
my_layout = Layout(title='一个图像的灰度直方图', xaxis=x_axis_config, yaxis=y_axis_config)
offline.plot({'data': data, 'layout': my_layout}, filename='gray_histogram.html')
cv2.waitKey(0)
cv2.destroyAllWindows()
上記のプログラムには、画像をしきい値処理するための 2 つのコードがあり、読者はプログラムを使用するときにそれらをコメントアウトできます。
ここでカウントする画像は、カラー画像をグレースケール画像に変換するセル画像です。
3 つのグレー レベル ヒストグラム分布の結果は次のとおりです。