画像表現とチャネル番号の問題、画像の読み取りと表示、cv2.imread(filename, flags=None)

画像表現とチャンネル数

デジタル画像の基本概念

デジタル画像の場合、私たちが見ているのは肉眼で見える実際の画像ですが、コンピューターにとってこの画像は、明るさが異なる単なる点の集まりにすぎません。M×Nの大きさの画像はM×Nの行列で表すことができ、行列要素の値がその位置の画素の明るさを表し、一般に画素値が大きいほどその点は明るくなります。

一般に、グレースケール画像は 2 次元行列で表され、カラー (マルチチャネル) 画像は 3 次元行列 (M × N × 3) で表されます。

———————————————————————————————————————

チャンネル数

シングル チャネル
一般にグレースケール イメージとして知られ、各ピクセルは色を表す値を 1 つだけ持つことができ、そのピクセル値は 0 ~ 255 の間で、0 は黒、255 は白です。グレースケール画像は、RGB の 3 つの成分を一定の比率に従って計算して得られる単一チャネルの画像であり、中間にいくつかの異なるレベルのグレーが存在します。グレースケールは黒と白の間の遷移色であると言え
、それを説明すると単一チャネルです。グレースケール画像と二値化画像はどちらも単一チャネル画像です。
2 8 2^{8}28 =2 2 2^{2}22(B) *2 3 2^{3}23(G) *2 3 2^{3}23 (R)
合計 256 色を表示
値の範囲: 0 ~ 255

  • グレースケール画像のビット深度は 1*8=8 です。
  • 2値化画像のビット深度は1×1=1となる。

3 つのチャネル
は RGB 3 色で、各ピクセルは 3 バイト (1 バイトは 8 ビットに等しい) で (RGB) を表し、最大値の範囲は 0 ~ 255 です。 2 24 2^{ 24
}224 =2 8 2^{8}28(B) *2 8 2^{8}28(G) *2 8 2^{8}28 (R)
したがって、RGB の各要素の値の範囲は 0 ~ 255 となります。
3 つの色の組み合わせは 256 * 256 * 256 = 16777216 となり、合計 16777216 色が表示されます 値の
範囲: 0 ~ 16777215
3 チャンネルは最もよく使用される画像です。3 チャネル マップは、各ピクセルが 3 つの値を表すことを意味します。ビット深度=3*8=24。

4 チャンネル
および 4 チャンネルの画像、つまり R、G、B に A チャンネルを加えたもので、透明度を示します。一般にアルファチャンネルと呼ばれ、透明度を意味します。
2 32 2^{32}232 = アルファ透明度 +2 8 2^{8}28(B) *2 8 2^{8}28(G) *2 8 2^{8}28 (R)
4 チャネル画像は、各ピクセルが 4 つの値表現を持つことを意味します (ビット深度 = 4*8 = 32)
。PNG は、RGBA を使用する画像フォーマットです。

バイナリ化されたイメージ
バイナリ イメージの意味は、各イメージの各ピクセルが 0 または 255 のみを取ることができるということです。0 は黒、255 は白、つまり黒か白のいずれかです。カラー画像をグレースケールに変換して出力します。
ビット深度は 1 です。これは、各ピクセルが 1 ビット、つまり 1 または 0 で表されることを意味します。

チャネル番号間の変換

# 高通道数向低通道数转化
img_gray=img.convert('L')  # 将四通道或三通道图片转化为灰度图
img_white=img.convert('1') # 将四通道,三通道,灰度图转化为二值化图片
#低通道数向高通道数转化,主要涉及到灰度图向RGB的转化。

# 灰度图向三通道图的转化注意这里输出的图片依然是灰色的,但是位深度已经达到24.
img_color=img_gray.convert('RGB') 

———————————————————————————————————————

次に、画像がどのように保存されるか、さらにはどのようにエンコードされるかについて説明します。
単一チャネル画像、つまりグレースケール画像の場合、以下に示すように、各ピクセル値は 8 ビット バイナリを使用できます。
ここに画像の説明を挿入

このうち、I(ij)はi行j列の輝度値を表します。

RGB 画像などのマルチチャネル画像の場合、各ピクセルは 3 バイトで表されます。OpenCV では、RGB 画像のチャネル順序は BGR であり、ストレージは次の図のようになります。
ここに画像の説明を挿入

元のリンク: https://blog.csdn.net/mao_hui_fei/article/details/78217049

———————————————————————————————————————

画像を読み取って表示する

cv2.imread パラメータの概要
cv2.imread(filename, flags=None)

ファイル名: 画像アドレス (例: './xxx.png')

flags: 読み取りデータの形式を示すフラグビット

  • -1: 元の画像。読み取った画像の元のカラーチャンネルを保持します。IMREAD_UNCHANGED と同等
  • 0: グレースケール画像。IMREAD_GRAYSCALE と同等
  • 1: カラーマップ。画像の透明度は無視されます。これがデフォルトのパラメータです。IMREAD_COLOR と同等

コードは以下のように表示されます。

# 引入包
import cv2 as cv

img = cv.imread("./static/image/blur.jpg")
#Mat imread(const String& filename,int flags);  读取图片
# 第一个参数是图片地址:“\”"\\"和"/" "//"   无论正反,单双python2.7实测没影响
# 第二个参数是图片读取方式:默认正常读取,如果为0 则为 灰度图

cv.namedWindow("Image", 0)
# cv.NamedWindow( const char* name, int flags );
# 创建窗口,其实不写这行代码也可以show出来。
#  第一个参数是窗口名字,尽量使用英文命名,中文会出现乱码
# 第二个参数是窗口显示方式, 为0或cv.WINDOW_NORMAL:可以改变窗口大小,不写或cv.WINDOW_AUTOSIZE则不可改变大小

cv.imshow('Image', img)
# mshow(const string& winname, InputArray mat) 显示图片窗口
# 第一个参数:窗口名称。如果上面有NamedWindow()函数,这个名称要与它一样,不然会出现两个窗口,一个是NamedWindow的空白窗口,一个是imshow的图片窗口。
# 第二个参数:要显示的图片。
# 如果窗口是用CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小。否则,将图像进行缩放以适合窗口。而imshow 函数缩放图像,取决于图像的深度

cv.waitKey(5000)
# waitKey(K) 窗口显示时间,单位:毫秒
# k=0: (也可以是小于0的数值)一直显示,键盘上按下一个数字键即会消失
# k>0:显示多少毫秒

cv.destroyAllWindows() # 删除建立的全部窗口,释放资源

結果の表示:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_33538887/article/details/126478280