OpenCVスタディノート02--画像ピクセル処理-バイナリ画像、グレースケール画像、カラー画像ピクセル処理、numpy.arrayの対応する機能

 コンテンツ

(1)グレースケール画像のピクセル処理

(2)カラー画像の画素処理

(3)画像処理におけるnumpy.arrayライブラリの適用

(4)画像の属性情報を表示する


        次に、注01は要約を続けます。画像を読み取るとき、それは通常、バイナリ画像、グレースケール画像、およびカラー画像です。バイナリイメージとは、イメージを構成するピクセルが黒または白のいずれかであるということです。値は2つだけです。doubleタイプでは、0は黒を表し、1は白を表します。uint8の場合、0は黒を表し、255は白を表します。画像のピクセルが2色だけでなく、白と黒の間の灰色、つまり白と黒の間のスペースをいくつかのセグメントに分割し、各セグメントで構成されている場合はグレーを表します。度数が異なり、このとき表示される画像はグレースケール画像です。カラー画像は色にさまざまな影響を及ぼします。たとえば、rgbカラー画像は3つのチャネルで構成され、各カラーピクセル値は、対応するピクセル値を3つのチャネルに重ね合わせて表示される色です。

(1)グレースケール画像のピクセル処理

ここでは、誰もが練習できるように、使用したレナグレースケール画像を最初に公開しています。以下に示すように。

アイデア:

最初のステップ:最初にファイルを読み取り、次にピクセルで構成される値マトリックスを表示して、元の画像を表示します。

ステップ2:元の画像マトリックスの特定のピクセル値または特定のピクセル値にアクセスし、これらのピクセル値を変更します

ステップ3:変更された画像と変更されたピクセル値を表示します。

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

import cv2
# 读取灰度图像,然后对像素值和图像显示,然后修改之后显示修改之后的图像和像素
filename = r'C:\Users\LBS\Desktop\lenagray.png'
# 读取图像
f = cv2.imread(filename)
# 显示图像,one是显示图像的窗口的名字
cv2.imshow('one', f)
# 打印图像对应的像素值的矩阵
print(f)
# 利用for循环对原图像的第10行到第99行,第80列到第99列的像素值改为255,
for i in range(10,100):
    for j in range(80,100):
        f[i, j] = 255
# two代表修改后的图像
cv2.imshow('two', f)
print('f(10:100, 80:100)={0}'.format(f[10:100, 80:100]))
# 按下任意键关闭图像窗口
cv2.waitKey()
cv2.destroyAllWindows()

結果:

左の画像は元の画像、右の画像は変更後の画像です。255のピクセル値を割り当てたため、長方形の白いボックスが表示されていることがわかります。

出力ピクセルの結果は次のとおりです。

変更された部分は255になりました。 

(2)、カラー画像のピクセル処理

        rgbカラー画像が処理のためにopencvに読み込まれると、第1層、第2層、および第3層は、それぞれbチャネル、gチャネル、およびrチャネルに対応し、matlabのチャネルの対応する順序に対応します。処理は正反対です。ただし、各チャネルの操作には影響しません。画像をfとして追加すると、f [:、:、0]、f [:、:、1]、f [:、:、2]はbチャネル、gチャネル、およびrのピクセル値に対応します画像のチャンネルの場合、cv2.split(f)[0]、cv2.split(f)[1]、cv2.split(f)[2]を使用して3つのチャンネルを取得することもできます。各チャネルは、グレースケール画像に対応するピクセル値のマトリックスと見なすことができます。

画像f[x、y、z]では、xは画像の行、yは画像の列、zはチャネルを表します。f[x、y]の場合、対応する3つのチャネルです。 、および印刷出力x行y列には3つの値があります

アイデア:

最初のステップ:最初にカラー画像の3次元配列を取得します。必要に応じて、各チャネルのピクセル値の2次元配列を取得します

ステップ2:次に、ピクセル値にアクセスして3D配列のピクセルを変更します。

ステップ3:ピクセル値が変更された画像を表示し、変更されたピクセルの値情報を印刷します。

対応するコード:

import numpy as np
import cv2
# 读取彩色图像
filename = r'C:\Users\LBS\Desktop\lena.jpg'
f = cv2.imread(filename)
# 显示彩色图像
cv2.imshow('01', f)
print("修改像素之前,个别像素对应的像素值\n")
# 图像f[x,y,z]中x代表图像的行,y代表图像的列,z代表的某一通道,若为f[x,y],则是对应的三个通道,打印输出的x行y列有三个值
print("f[0, 0]=\n", f[0, 0])
print("f[50,0]=\n", f[50, 0])
print("f[100,0]\n", f[100, 0])
# 对彩色图像的像素进行处理,这里的三重for循环是对三个通道的值都进行修改
for i in range(0, 50):
    for j in range(0, 100):
        for k in range(0, 3):
            f[i, j, k] = 255
for i in range(50, 100):
    for j in range(0, 100):
        for k in range(0, 3):
            f[i, j, k] = 128
# 如果没有指定对0、1、2、中的哪个通道对应的像素值进行修改时,则同时修改的是三个通道对应的像素值,三个通道都被修改为相同的值。
# 这里三个通道对应的值都为0,即黑色,可以通过图像进行观察
for i in range(100, 150):
    for j in range(0, 100):
        f[i, j] = 0
# 显示修改之后的图像
cv2.imshow('02', f)
print("修改像素之后,个别像素对应的像素值\n")
print("f[0, 0]=\n", f[0, 0])
print("f[50,0]=\n", f[50, 0])
print("f[100,0]\n", f[100, 0])
cv2.waitKey()
cv2.destroyAllWindows()

対応する結果画像を次の図に示します。

01は元の画像、02は変更された画像です。 

画素値変更前後のプリントアウト結果を下図に示します。

 (3)画像処理におけるnumpy.arrayライブラリの適用

       このライブラリには、item()、itemset()の2つの関数があり、これらを使用してピクセルにアクセスし、ピクセル値を変更できます。これら2つの関数を使用しない場合は、前の(1)と同じように操作することもできます。 2)私たちは皆、画像オブジェクトを介して直接操作します。

グレースケール画像の場合:

item(row、column):itemは画像オブジェクトであり、前のfと同様に、行と列ごとにピクセルの値を決定できます。

itemset((row、column)、変更する値):これは、前の操作よりも少し便利です。このステートメントを使用すると、ピクセルを直接変更できます。

カラー画像の場合:

item(row、column、channel):itemは、前のfと同様に、行と列による画像オブジェクトであり、チャネルは特定のチャネルのピクセルの値を決定できます。

itemset((row、column、channel)、変更する値):つまり、最初に(row、column、channel)でピクセルを決定し、次に変更する値で変更します。チャネルの値を省略すると、3つのチャネルの値に対して同じ値の割り当て操作が実行されます。

(4)画像の属性情報を表示する

fが画像を表す場合、渡すことができます

f.shape:画像の行、列、およびチャネルの数を取得します(カラー画像の場合)。

f.size:画像のピクセル数、つまり画像全体のピクセル数を取得します。

f.dtype:画像のデータ型を表示できますf。

概要:上記はピクセルの基本的な操作です。練習してください。

ソースを教えてください。書くのは簡単ではありません。

OpenCVスタディノート03--画像操作-画像加算操作、画像ビット操作、画像マスク

おすすめ

転載: blog.csdn.net/BaoITcore/article/details/123918053