7. opencv-python画像処理の応用操作(4) - ヒストグラム

学習目標

ヒストグラム計算と画像表示をマスターする

マスクの用途について学ぶ

ヒストグラムイコライゼーションに精通し、適応イコライゼーションを理解する

1. グレースケールのヒストグラム

1. 原則

  ヒストグラムはデータの統計手法であり、統計値を実装定義の一連のビンに編成します。ビンはヒストグラムでよく使用される概念で、「直線バー」または「グループ距離」と訳されます。その値は、データから計算された特性統計量です。これらのデータには、勾配、方向、色、その他のあらゆる特性が含まれます。
  画像ヒストグラムは、デジタル画像の輝度分布を表すために使用されるヒストグラムで、画像内の各輝度値のピクセル数をプロットします。このヒストグラムでは、横軸の左側が暗い領域です。したがって、暗い画像ではヒストグラム内のより多くのデータが左側と中央の部分に集中しますが、影がわずかしかない全体的に明るい画像ではその逆が当てはまります。
ここに画像の説明を挿入します
: ヒストグラムは、カラー画像ではなく、グレースケール画像に対してプロットされます。画像に関する情報があるとします (グレースケール値 0 ~ 255)。既知の数値の範囲には 256 の値が含まれるため、この範囲は特定のルールに従ってサブ領域 (つまり、ビン) に分割できます。例:
ここに画像の説明を挿入します
次に、各ビン (i) のピクセル数を数えます。次の図が得られます (X 軸はビンを表し、Y 軸は各ビンのピクセル数を表します)。
ここに画像の説明を挿入します
ここでは、ヒストグラムの説明内のいくつかの専門用語に注意する必要があります。

dims:需要统计的特征数目,在上述例子中,dims=1,因为仅表示了灰度值
bins:每个特征空间子区段的数目,可译为“直条”或“组距”,在上例中,bins=16
range:要统计特征的取值范围。在上例中,range = [0,255]

ヒストグラムの意味:
ヒストグラムは、画像内のピクセルの強度分布をグラフで表現したものです。
各強度値のピクセル数を数えます。
異なる画像のヒストグラムは同じである場合があります。

2. グレースケールヒストグラムの描画

通常、opencv のメソッドを使用してヒストグラムをカウントし、matplotlib を使用してヒストグラムを描画します。
API:

cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

パラメータ:

images: 原图像。当传入函数时应该用中括号 [] 括起来,例如:[img]。
channels: 如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R。   
mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。(后边有例子)   
histSize:BIN 的数目。也应该用中括号括起来,例如:[256]。   
ranges: 像素值范围,通常为 [0,256]

コード例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 1 直接以灰度图的方式读入
img = cv.imread('./image/cat.jpeg',0)
# 2 统计灰度图
histr = cv.calcHist([img],[0],None,[256],[0,256])
# 3 绘制灰度图
plt.figure(figsize=(10,6),dpi=100)
plt.plot(histr)
plt.grid()
plt.show()

ここに画像の説明を挿入します

3. マスクの役割

マスクとは、選択した画像、グラフィック、オブジェクトを使用して処理対象の画像をブロックし、画像処理領域を制御することです。

デジタル画像処理では、通常、マスキングに 2 次元行列配列を使用します。マスク画像は、処理対象の画像をマスクするための0と1の2値画像で、値が1の部分は処理され、値が0の部分はマスクされて処理されません。
マスクの主な用途は次のとおりです。

1. 関心領域の抽出: 事前に作成された関心領域マスクを使用して、処理対象の画像と「AND」演算を実行し、関心領域画像を取得します。対象領域内の画像値は変更されませんが、領域外の画像値はすべて 0 です。
2. シールド効果: マスクを使用して画像上の特定の領域をシールドし、その領域が処理または処理パラメータの計算に関与しないようにするか、シールドされた領域のみが処理またはカウントされるようにします。
3. 構造的特徴の抽出: 類似性変数または画像マッチング手法を使用して、マスクに類似した画像内の構造的特徴を検出および抽出します。
4. 特殊形状画像制作

マスクはリモート センシングの画像処理でよく使用され、道路、河川、家屋を抽出する場合、マスク マトリックスを使用して画像のピクセルをフィルタリングし、必要な地物やランドマークを強調表示します。
cv.calcHist() を使用して、完全な画像のヒストグラムを見つけます。画像のある領域のヒストグラムを見つけたい場合は、ヒストグラムを見つけたい領域の上に白のマスク画像を作成し、それ以外の場合は黒を作成して、それをマスクとして渡します。

コード例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 1. 直接以灰度图的方式读入
img = cv.imread('./image/cat.jpeg',0)
# 2. 创建蒙版
mask = np.zeros(img.shape[:2], np.uint8)
mask[400:650, 200:500] = 255
# 3.掩模
masked_img = cv.bitwise_and(img,img,mask = mask)
# 4. 统计掩膜后图像的灰度图
mask_histr = cv.calcHist([img],[0],mask,[256],[1,256])
# 5. 图像展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8))
axes[0,0].imshow(img,cmap=plt.cm.gray)
axes[0,0].set_title("原图")
axes[0,1].imshow(mask,cmap=plt.cm.gray)
axes[0,1].set_title("蒙版数据")
axes[1,0].imshow(masked_img,cmap=plt.cm.gray)
axes[1,0].set_title("掩膜后数据")
axes[1,1].plot(mask_histr)
axes[1,1].grid()
axes[1,1].set_title("灰度直方图")
plt.show()

ここに画像の説明を挿入します

2. ヒストグラムの等化

1. 原理と応用

画像内のほとんどのピクセルのピクセル値が小さなグレー値の範囲内に集中している場合はどうなるかを想像してみてください。画像が全体的に非常に明るい場合、すべてのピクセル値の値の数は非常に多くなるはずです。したがって、画像のピクセル値の分布範囲を拡大し、画像のコントラストを向上させるために、ヒストグラムを水平方向に引き伸ばす必要があります (以下に示すように)。これがヒストグラム均等化の機能です。
ここに画像の説明を挿入します

「ヒストグラム等化」とは、元の画像の階調ヒストグラムを、比較的集中した階調間隔から、より広い階調範囲の分布に変更することです。ヒストグラム等化とは、特定のグレースケール範囲内のピクセル数がほぼ同じになるように、画像を非線形に引き延ばし、画像のピクセル値を再分配することです。
この方法は、特に有用なデータのピクセル値分布が比較的近い場合に、画像全体のコントラストを向上させます。骨格構造の表示を改善するために X 線画像で広く使用されています。また、強調表示することもできます。露出オーバーまたは露出アンダーの画像の詳細。ヒストグラム統計に opencv を使用する場合、次のAPI
が使用されます。

dst = cv.equalizeHist(img)

パラメータ:
img: グレースケール画像
戻り値:
dst: 均等化された結果

コード例:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
# 1. 直接以灰度图的方式读入
img = cv.imread('./image/cat.jpeg',0)
# 2. 均衡化处理
dst = cv.equalizeHist(img)
# 3. 结果展示
fig,axes=plt.subplots(nrows=2,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img,cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(dst,cmap=plt.cm.gray)
axes[1].set_title("均衡化后结果")
plt.show()

ここに画像の説明を挿入します

2. 適応ヒストグラム等化

上記のヒストグラム均等化では、画像の全体的なコントラストを考慮します。確かに、ヒストグラムイコライゼーションを行うと写真の背景のコントラストが変わってしまいますが、猫脚が暗すぎて情報が失われてしまって、効果が良くない場合が多いです。以下に示すように、像の 2 つの画像を比較すると、明るすぎたために多くの情報が失われています。
ここに画像の説明を挿入します
この問題を解決するには、適応ヒストグラム等化を使用する必要があります。このとき、画像全体を「タイル」と呼ばれる多数の小さなブロックに分割し(OpenCVのタイルのデフォルトサイズは8x8)、小さなブロックごとにヒストグラム均等化を行います。したがって、各領域でヒストグラムは小さな領域に集中します)。ノイズがあるとノイズが増幅されてしまいます。この状況を回避するには、コントラスト制限を使用します。小さなブロックごとに、ヒストグラム内のビンがコントラストの上限を超える場合、ピクセルは他のビンに均等に分散され、ヒストグラムが均等化されます。
ここに画像の説明を挿入します最後に、各小さなブロック間の境界を除去するために、双一次差分を使用して各小さなブロックを結合します。

API:
cv.createCLAHE(clipLimit, tileGridSize)
パラメータ:
ClipLimit: コントラスト制限、デフォルトは 40
tileGridSize: タイル サイズ、デフォルトは 8*88*8
コード例

import numpy as np
import cv2 as cv
# 1. 以灰度图形式读取图像
img = cv.imread('./image/cat.jpeg',0)
# 2. 创建一个自适应均衡化的对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
# 3. 图像展示
fig,axes=plt.subplots(nrows=1,ncols=2,figsize=(10,8),dpi=100)
axes[0].imshow(img,cmap=plt.cm.gray)
axes[0].set_title("原图")
axes[1].imshow(cl1,cmap=plt.cm.gray)
axes[1].set_title("自适应均衡化后的结果")
plt.show()

ここに画像の説明を挿入します

要約する

1. グレースケールのヒストグラム

ヒストグラムは、画像内のピクセルの強度分布をグラフで表現したものです。

各強度値のピクセル数をカウントします。

異なる画像のヒストグラムは同じである可能性があります
cv.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

2.マスク

3. ヒストグラムイコライゼーション: 画像のコントラストを向上させる方法

4. 適応ヒストグラム等化

この部分はまだよく理解できていないので、理解できたらまた最適化していきます。

おすすめ

転載: blog.csdn.net/weixin_44463519/article/details/126043626