Python 画像処理 II: 画像ピクセルのアクセスとデータ型

画像ピクセルのアクセスとデータ型

イメージがプログラムに読み込まれると、それは numpy 配列として存在するため、numpy 配列のすべての関数はイメージにも適用できます。配列要素へのアクセスは、実際には画像ピクセルへのアクセスです。

1. 画像ピクセルへのアクセス

カラー画像のアクセス方法は、img[i,j,c]です。

iは画像の行数、jは画像の列数、cは画像のチャンネル数(RGBの3チャンネルがそれぞれ0、1、2に対応)を表し、座標は上から始まります。左の角。

グレースケール画像のアクセス方法は次のとおりです: grey[i,j]

例 1: 子猫画像の G チャネルの 20 行 30 列のピクセル値を出力する、コード例は次のとおりです。

from skimage import io,data

img=data.chelsea()
pixel=img[20,30,1]
print(pixel)

出力は
129です

例 2: 赤色の単一チャネル画像を表示する。コード例は次のとおりです。

from skimage import io,data

img=data.chelsea()
R=img[:,:,0]
io.imshow(R)

2. 画像ピクセルの変更

ピクセルの読み取りに加えて、ピクセル値を変更することもできます。

例 3: 子猫の画像に塩コショウのノイズをランダムに追加します。コード例は次のとおりです。

from skimage import io,data
import numpy as np

img=data.chelsea() 


#随机生成5000个椒(盐)噪声

rows,cols,dims=img.shape
for i in range(5000):
    x=np.random.randint(0,rows)
    y=np.random.randint(0,cols)
    img[x,y,:]=255

io.imshow(img)

ここでは numpy パッケージのrandomを使用して乱数を生成し、randint(0,cols)は0からcolsまでの整数をランダムに生成することを意味します。

img[x,y,:]=255 という文を使用してピクセル値を変更し、元の 3 チャネルのピクセル値を 255 に変更します。

3. 画像のトリミング

配列を切り出すことで画像の切り出しを実現できます。

例 4: 子猫の画像をトリミングするコード例は次のとおりです。

from skimage import io,data

img=data.chelsea()
roi=img[80:180,100:200,:]
io.imshow(roi)

複数のピクセルを操作するには、配列スライスを使用してアクセスします。スライスメソッドは添字でアクセスした配列のピクセル値を指定された間隔で返します。グレースケール画像の例をいくつか示します。

img[i,:] = im[j,:]       # 将第j行的数值赋值给第 i 行

img[:,i] = 100           # 将第i 列的所有数值设为 100

img[:100,:50].sum()      # 计算前100行、前50列所有数值的和

img[50:100,50:100]       # 50~100 行,50~100 列(不包括第100 行和第 100 列)

img[i].mean()            # 第i行所有数值的平均值

img[:,-1]                # 最后一列

img[-2,:] (or im[-2])    # 倒数第二行

例5: 子猫の画像を読み取るには、まず
赤色成分のすべてのピクセル値を判断し、170より大きい場合は、この場所のピクセル値を[0,255,0]、つまりGチャンネルに変更します
。値は 255、R および B チャネル値は 0

 

from skimage import io,data

img=data.chelsea()

reddish = img[:,:, 0] >170

img[reddish] = [0,255, 0]

io.imshow(img)

 


4. 画像データの種類と変換

skimage では、画像は単純な numpy 配列ですが、配列には多くのデータ型があり、相互に変換できます。これらのデータ型と値の範囲を次の表に示します。

データの種類 範囲
uint8 0~255
uint16 0~65535
uint32 0 ~2^32
浮く -1~1または0~1
あなた8 -128~127
int16 -32768 ~ 32767
int32 -2^31 ~ 2^31 - 1

グレースケール イメージのピクセル値の範囲は [0,255] であるため、デフォルトのタイプはunit8 であり、次のコードを使用してデータ タイプを表示できます。

from skimage import io,data

img=data.chelsea()
print(img.dtype.name)

上の表では、float 型に特に注意してください。その範囲は [-1,1] または [0,1] です。カラー画像がグレースケール画像に変換されると、その型はunit8からfloatに変わります。

1. Unit8 をフロートにします

from skimage import data,img_as_float

img=data.chelsea()
print(img.dtype.name)

dst=img_as_float(img)
print(dst.dtype.name)

出力
uint8
float64

2. uint8 への浮動小数点数

from skimage import img_as_ubyte
import numpy as np

img = np.array([0, 0.5, 1], dtype=float)
print(img.dtype.name)

dst=img_as_ubyte(img)
print(dst.dtype.name) 

出力:
float64
uint8

float をunit8 に変換するとデータが失われる可能性があるため、警告が表示されます。

例 6: コーヒー画像を 2 値化すると、128 より大きいピクセル値は 1 になり、それ以外の場合は 0 になります。

from skimage import io,data,color

img=data.coffee()
img_gray=color.rgb2gray(img)

rows,cols=img_gray.shape
for i in range(rows):
    for j in range(cols):
        if (img_gray[i,j]<=0.5):
            img_gray[i,j]=0
        else:
            img_gray[i,j]=1

io.imshow(img_gray)

この例では、カラー モジュールの rgb2gray() 関数を使用して、カラー イメージをグレースケール イメージに変換します。変換結果は float64 型の配列で、範囲は [0,1] です。

これらの最も一般的に使用される 2 つの変換に加えて、次の表に示すように、その他の型変換もあります。

関数 関数
img_as_float 64 ビット浮動小数点に変換します。
img_as_ubyte 8 ビット単位に変換します。
img_as_int 16ビット整数に変換します。
img_as_uint 16 ビット単位に変換します。

おすすめ

転載: blog.csdn.net/weixin_52051554/article/details/127486378