画像形式の基礎知識
PNG(Portable Network Graphics)
- Webでのビットマップ画像を扱うために1996年に生まれた。GIFなどに対して後発なのでGIFなどで足りない機能が追加されている。
- 8bit/24bitの2つの形式がある。8bitは256色での保存、24ビットはフルカラー写真、透明色を持たせられる。
- PNGも圧縮されている(なんと知らなかった。。。)。ただし、JPEGが非可逆圧縮であるのに対して可逆圧縮。
メモ
グレースケール化
- RGBをグレースケール化する場合、単純にRGBの平均値を取るわけじゃないらしい。実際には下記の式で変換するらしい。
Gray = 0.3 \cdot R + 0.59 \cdot G + 0.11 \cdot B
pythoでの扱い
- openCV使わなくてもPIL(Python Image Library)でも多くのことが出来て使い方も簡単な印象だ。
- scikit-imageというのも使いやすそうだ。
画像のピクセルデータの読み書き
img = Image.open(sys.argv[1])
img.show()
img.mode
img.size
img.height
img.width
img.getpixel((32, 32))
img.putpixel((5,5), (0,0,255))
img_array = np.array(img)
Image.fromarray(arr_data)
基本的な処理
- 基本的な処理は自分で書かなくても用意されている。
- RGBの分離が良くわからない。splitしたものと、他を0に潰したものって違うのかな??
img.resize((100, 100))
img.rotate(45)
img.convert('L')
img.convert('LA')
canvas = Image.new('RGB', (600, 200), (255, 255, 255))
canvs.paste(img1, (0,0))
canvs.paste(img2, (200,0))
canvs.paste(img3, (400,0))
canvas.crop((0,0,200,200))
r, g, b, a = img.split()
img_array = np.array(img)
r_img_array = img_array[:,:,(1,2)] = 0
r_img_array = img_array[:,:,(0,1)] = 0
r_img_array = img_array[:,:,(0,2)] = 0
r, g, b = img.split()
img2 = Image.merge('RGB', (g, b, r))
img.resize((32,32)).resize(200,200)
画像生成
- 結構簡単に画像を作れる。下の例は白黒のモザイク画像。
img = Image.new('RGB', (32, 32))
for y in range(img.width):
for x in range(img.width):
if (y+x)%2 == 0:
img.putpixel((x,y), (255, 255, 255))
else:
img.putpixel((x,y), (0, 0, 0))
img.save('mozaic.png')