画像のグレースケール
将彩色图像转化成为灰度图像的过程成为图像的灰度化处理。
カラー画像の各ピクセルの色は、R、G、B の 3 つの成分によって決まり、各成分の中央値は 255 であるため、ピクセルは 1,600 万 (255 255 255) 以上の色のバリエーションを持つことができます。グレースケール画像は、R、G、B の同じ 3 成分 (R=G=B) を持つ特殊なカラー画像であり、1 つのピクセル点の変化範囲は 255 であるため、デジタル画像処理では一般に各画像が最初に処理されます。この形式の画像は、後続の画像の計算負荷を軽減するためにグレースケール画像に変換されます。グレースケール イメージの記述には、カラー イメージと同様に、イメージ全体の全体的および局所的な色度および輝度レベルの分布と特性が反映されます。
平均法
R、G、B コンポーネントの平均値を取得すると、式は次のようになります。
Gray ( x , y ) = ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) / 3 グレー(x, y)=(R(x,y)+G(x,y)+B(x,y))/3灰色( x 、_ _ _y )=( R ( x ,y )+G ( x ,y )+B ( x ,y )) /3
def grayByaverage(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# 图像最大值灰度处理
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
grayimg[i, j] = np.uint8(gray)
return grayimg
最大法
R、G、B コンポーネントの最大値を取得すると、式は次のようになります。
Gray ( x , y ) = max ( R ( x , y ) + G ( x , y ) + B ( x , y ) ) グレー(x, y)=max(R(x,y)+G(x,y)+B(x,y))灰色( x 、_ _ _y )=max ( R ( x , _y )+G ( x ,y )+B ( x ,y ))
def grayByaverage(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# 图像最大值灰度处理
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
grayimg[i, j] = np.uint8(gray)
return grayimg
加重平均法
重要度およびその他の指標に従って、3 つのコンポーネントが異なる重み付けで重み付けされ、平均されます。人間の目は緑に対する感度が最も高く、青に対する感度が最も低いため、次の式に従って RGB の 3 つの成分に重み付けを行うことで、より適切なグレースケール画像を取得できます。式は次のとおりです。
Gray ( x , y ) = 0.11 R ( x , y ) + 0.59 G ( x , y ) + 0.30 B ( x , y ) Gray(x,y)=0.11R(x,y) +0.59 G(x,y)+0.30B(x,y)灰色( x 、_ _ _y )=0.11 R ( x 、y )+0.59G (× 、_y )+0.30 B ( x 、y )
def grayByWeightedaverage(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
grayimg[i, j] = np.uint8(gray)
return grayimg
3 つのグレースケールの結果は次のとおりです: 結果
の分析:
3 つのグレースケール画像のうち、最大値法で得られたグレースケール画像は明るく、加重平均法で得られたグレースケール画像は柔らかく、平均値で求めたグレースケール画像は暗くなり、それ以外は暗くなります。
コード全体
import cv2
import numpy as np
import matplotlib.pyplot as plt
#图像灰度化
#最大值法
def grayBymax(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# 图像最大值灰度处理
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = max(img[i,j][0], img[i,j][1], img[i,j][2])
grayimg[i, j] = np.uint8(gray)
return grayimg
def grayByaverage(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
# 图像最大值灰度处理
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = (int(img[i,j][0])+int(img[i,j][1])+int(img[i,j][2]))/3
grayimg[i, j] = np.uint8(gray)
return grayimg
def grayByWeightedaverage(img):
# 获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
# 创建一幅图像
grayimg = np.zeros((height, width, 3), np.uint8)
for i in range(height):
for j in range(width):
# 获取图像R G B最大值
gray = 0.30 * img[i, j][0] + 0.59 * img[i, j][1] + 0.11 * img[i, j][2]
grayimg[i, j] = np.uint8(gray)
return grayimg
if __name__ == '__main__':
img = cv2.imread('miao.jpg')
opencv_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
grayByaverage=grayByaverage(img)
grayBymax=grayBymax(img)
grayByWeightedaverage=grayByWeightedaverage(img)
# # 显示图像
# cv2.imshow("src", img)
# cv2.imshow("gray", opencv_gray)
# # 等待显示
# cv2.waitKey(0)
# cv2.destroyAllWindows()
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(80, 80))
plt.rcParams['font.sans-serif'] = [
'FangSong'] # 支持中文标签
fig, ax = plt.subplots(2, 2)
ax[0, 0].imshow(imgRGB)
ax[0, 1].imshow(grayByaverage)
ax[1, 0].imshow(grayBymax)
ax[1, 1].imshow(grayByWeightedaverage)
ax[0, 0].title.set_text("原图")
ax[0, 1].title.set_text("平均值法")
ax[1, 0].title.set_text("最大值法")
ax[1, 1].title.set_text("加权平均值法")
ax[0,0].axis("off")
ax[0,1].axis("off")
ax[1,0].axis("off")
ax[1,1].axis("off")
fig.tight_layout()
plt.savefig("gray.jpg")
plt.show()
参考記事
画像処理におけるグレースケールと二値化