search
LoginSignup
1

More than 3 years have passed since last update.

posted at

IQ1なのでPhotoshopの代わりにOpenCVを使う

はじめに

 この記事はIQ1 Advent Calendar 2018の3日目です。
 私の大学はAdobeと包括契約しているので,Adobeの色々なソフトを無料で使うことができます.ですが,私はIQが1しかないのでそれらの高級ソフトを使いこなすことができません.そこで,画像をちょっと編集したいなぁ......と思った時,Photoshopの代わりにOpenCVでやることを思いつきました.
 というわけで,とても簡単な作業だけですが今まで書いたコードを供養します.ちなみに全部Pythonです.簡単な作業なので.

画像の拡大・縮小

 そもそもIQの高い皆さんはこんなことにPhotoshopすら使わないと思いますが.今から載せるコードたちは全て以下の関数を省略しています.

# 最初に画像の読み込み
src = cv2.imread("hode.jpg")

# 最後に画像の出力
cv2.imwrite("fuga.jpg", dst)

 画像のサイズを変更するとき,サイズを直接指定する場合と倍率を指定する場合があります.

# サイズを直接指定する場合
width = 640
height = 480
dst = cv2.resize(src, (width, height))

# 倍率で指定する場合
dst = cv2.resize(src, None, fx=2, fy=2)

画像のトリミング

 OpenCVでは画像は行列として解釈されるので,長方形のトリミングなら簡単です.

# 行列なのでshapeは(縦,横,色チャンネル数)の順に並んでいるので注意
h, w = src.shape[0:2]

#各端を指定
left = w//3
right = w
top = h//2
bottom = h

dst = src[top:bottom, left:right]

 他の形はIQ1だと数式で記述するしか思いつかなかったので,その中でも一番簡単な円だけ載せます.

# 切り取るサイズの背景を用意
r = 200
dst = np.ones((r, r, 3), dtype=np.uint8) * 255

# 元画像からコピーする
h, w = src.shape[0:2]
center = (h//2, w//3)
for y in range(h):
    for x in range(w):
        if np.sqrt((y-center[0])**2 + (x-center[1]**2)) <= r:
            dst[y][x] = src[y][x]

追記:srcと同じ黒画像を作成して任意の場所に図形を描く関数で白い図形を描いてcv2.bitwise_and()でマスクすればいいことに気付きました。IQ2になれましたね。

画像のグレースケール化

 もはやノーコメント

dst = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)

画像の結合

 大きな背景画像にペタペタと貼っていく感覚です。


src_list = #画像を複数用意

# 縦×横
h, w = src.shape[0:2]
layout = (3, 4)

dst = np.ones((h*layout[0], w*layout[1]), dtype=np.uint8)

for y in range(layout[0]):
    for x in range(layout[1]):
        dst[h*y:h*(y+1), w*x:w*(x+1)] = src_list[y*layout[1]+x]

 ここでIQ1なお知らせです。私はモバゲー版アイドルマスターシンデレラガールズにて、アイドルプロデュース7thアニバーサリーを走らなくてはいけないため、この記事はここで打ち切りとさせていただきます。12月10日より追記の予定です。それではみなさんさようなら。安部菜々をこれからもどうぞよろしくお願いいたします。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1