写真の輪郭を表示しよう
今回は写真の輪郭部分を表示してみましょう。
輪郭は対象のピクセルの右と下のピクセルの色の差分を表示させます。
例えば対象となるピクセルが(128,64,32)、右のピクセルが(50,50,50)、下のピクセルが(200,200,200)だった場合、赤は128-50と128-200の絶対値を足し算して150となります。
絶対値とは、基準となる値からどれだけ離れているのかを表します。
つまり負の値も正として扱うということです。
Pythonでは、絶対値はabs()関数を使います。
対象のピクセルが右と下のピクセルと同じ色だった場合は、黒(0,0,0)になります。
写真の輪郭を表示するプログラム
以下のプログラムでは、一番右と一番下のラインは計算していませんので、元の色がそのまま表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
### インポート import pygame from pygame.locals import * ### 定数 WIDTH = 640 # 幅 HEIGHT = 400 # 高さ ### モジュール初期化 pygame.init() ### 画面設定 surface = pygame.display.set_mode((WIDTH,HEIGHT)) ### 写真読み込み img = pygame.transform.rotozoom(pygame.image.load("photo.jpg").convert(), 0, 0.2) ### 画像サイズ保存 img_w = img.get_width() img_h = img.get_height() ### 写真のピクセルを直接編集 pixel = pygame.PixelArray(img) ### Y座標、X座標の色を取得 for y in range(img_h-1): for x in range(img_w-1): ### カラー定数をRGBA形式に変換 rgba = surface.unmap_rgb(pixel[x][y]) # 対象ピクセル right = surface.unmap_rgb(pixel[x+1][y]) # 右ピクセル under = surface.unmap_rgb(pixel[x][y+1]) # 下ピクセル ### 各RGB毎に計算 for idx in range(len(rgba)-1): ### 色の差分を設定 rgba[idx] = min(255, (abs(rgba[idx]-right[idx])+abs(rgba[idx]-under[idx]))) ### 色を書き換え pixel[x][y] = (rgba[0:-1]) ### オブジェクト削除 del pixel ### 写真表示 surface.blit(img, (int((WIDTH-img_w)/2),int((HEIGHT-img_h)/2))) ### 画面更新 pygame.display.update() ### 無限ループ while True: ### イベント処理 for event in pygame.event.get(): if event.type == KEYDOWN and event.key == K_ESCAPE: break else: continue ### whileループ終了 break ### 終了処理 pygame.quit() |
プログラムを実行すると、以下の画像が表示されます。
上記のプログラムではまだ明るさが足りないので、38行目を以下のように値を2倍にして明るさを調整します。
1 |
rgba[idx] = min(255, int((abs(rgba[idx]-right[idx])+abs(rgba[idx]-under[idx]))*2)) |
プログラムを実行すると、以下の画像が表示されます。