OpenCV ヒストグラムの原理と表示、マスキング、イコライゼーション、適応イコライゼーション

ヒストグラム

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

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

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

1.1 ヒストグラムの描画と計算

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

コード

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

#直接以灰度图的方式读入

img =cv.imread("lena.png",0)

#统计灰度图
histr = cv.calcHist([img],[0],None,[256],[0,256])
'''
 使用 OpenCV 的 calcHist 函数计算灰度图像的直方图。calcHist 函数接受以下参数:
[img]:需要计算直方图的图像,以列表形式传递。
[0]:指定通道的索引,因为我们处理的是灰度图像,所以只有一个通道,索引为 0。
None:用于指定掩码,通常不需要使用,所以设为 None。
[256]:指定直方图的大小,这里表示直方图有 256 个 bin,范围从 0 到 255。
[0, 256]:指定像素值的范围,这里表示所有像素值都在 0 到 255 的范围内。 
函数的返回值 histr 是一个包含直方图统计数据的数组。
'''
#绘制灰度图
plt.figure(figsize=(10,6),dpi=100)
'''指定画布的大小为 10x6 英寸,分辨率为 100dpi。'''
plt.plot(histr)
'''绘制直方图,将 histr 数组作为参数传递给 plot 函数。这将绘制一个包含灰度直方图统计数据的折线图'''
plt.grid()
'''添加网格线,提高图像的可读性'''
plt.show()

結果表示

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

2 マスクの適用

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

2.1 コードの実装`

import  numpy as np
import  cv2 as cv
import  matplotlib.pyplot as plt

from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#创建蒙版
mask = np.zeros(img.shape[:2],np.uint8)    #创建一个与图像大小相同的空白蒙版,数据类型为 uint8
mask[100:256,100:256]=255    #在蒙版上设置感兴趣区域,将其中的像素值设为 255。

#掩膜
mask_img = cv.bitwise_and(img ,img,mask=mask)  #函数对原图像和蒙版进行位与操作,得到掩膜后的图像
#统计掩膜后图像灰度图
mask_histr = cv.calcHist([img],[0],mask,[256],[1,256])   # 函数计算掩膜后图像的灰度直方图。这里传入了掩膜参数 mask,只统计蒙版区域内的像素

#图像显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4))
axes[0,0].imshow(img,cmap=plt.cm.gray)   #在第一个子图中展示原图像,使用灰度色彩映射 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(mask_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.2 結果表示

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

3 ヒストグラムイコライゼーション

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

画像の各グレー レベルのピクセル値が範囲全体に均等に分散されるように、画像のグレー レベルを再配分することにより、画像の視覚効果が向上します。

ヒストグラム等化の機能には次のものが含まれます。

画像のコントラストを強化する: ヒストグラム等化により、元の画像の各グレー レベルのピクセル値を引き伸ばすことができ、画像の明るさの変化がより明確になり、それによって画像のコントラストが強化されます。

詳細情報の強化: ヒストグラム イコライゼーションにより、画像内の低コントラスト領域のピクセル値が増加し、詳細がより鮮明に表示されます。これは、画像分析や画像認識タスクに役立ちます。

バックグラウンド ノイズの除去: ヒストグラム イコライゼーションにより、画像のグレー レベル分布を調整して、バックグラウンド ノイズの影響を軽減できます。これは、ターゲット オブジェクトを抽出する必要がある一部のアプリケーション シナリオでは非常に効果的です。

画像の視覚効果を強化する: ヒストグラム均等化により、画像の全体的な視覚効果がより鮮やかで鮮やかになり、画像の表示品質が向上します。

3.1 コードの実装

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

#直接以灰度图方式读入
img = cv.imread("lena.png",0)
histr_1 = cv.calcHist([img],[0],None,[256],[0,256])

#均衡化处理
dst = cv.equalizeHist(img)

histr_2 = cv.calcHist([dst],[0],None,[256],[0,256])

#显示
fig,axes = plt.subplots(nrows=2,ncols=2,figsize=(5,4),dpi=100)

axes[0,0].imshow(img,cmap=plt.cm.gray)
axes[0,0].set_title("原图")
axes[0,1].plot(histr_1)
axes[0,1].grid()
axes[0,1].set_title("原图-灰度直方图")

axes[1,0].imshow(dst,cmap=plt.cm.gray)
axes[1,0].set_title("均衡化结果")
axes[1,1].plot(histr_2)
axes[1,1].grid()
axes[1,1].set_title("均衡化直方图")
plt.show()

3.2 結果表示

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

4 適応イコライゼーション

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

4.1 コードの実装

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("lena.png",0)

#创建一个自适应均衡化对象,并应用于图像
clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) #clipLimit 参数指定了对比度限制,tileGridSize 参数指定了图像划分的网格大小
cl1 = clahe.apply(img)  #将自适应均衡化应用于图像 img,并将结果保存在变量 cl1

#图像显示
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(5,4),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()

4.2 運用結果

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

おすすめ

転載: blog.csdn.net/qq_53545309/article/details/133203824