1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MYJLabAdvent Calendar 2024

Day 6

OpenCVで写真を線画化してみた

Last updated at Posted at 2024-12-06

はじめに

こんばんは。
MYJLab Advent Calendar 2024の6日目を担当する宮治研3年の水野です。
これを機に何か新しいことをやってみようかな~と思っているうちにあっという間に自分の番が回ってきてしまいました。。計画力どうにかしたいです。(笑)
そんなわけで、先日テックプレゼンで発表した「OpenCVで写真を線画化してあそぼう」というテーマで紹介させていただきます!
3年生の皆さんはこんなのやってたな~くらいで読み飛ばしてもらえればうれしいです。

用意するもの

  • Google Colaboratory
  • 好きな画像ファイル

コードの説明

1. ライブラリ等を読み込む

import numpy as np
import cv2
from google.colab import files
from google.colab.patches import cv2_imshow  # 画像を表示するために追加

# ファイルをアップロード
uploaded = files.upload()

cv2はOpenCVのことです。

2. 一旦カラーで写真を確認してみる

# カラーで読み込み
img = cv2.imread('hachi.jpg')

# 出力画像のサイズを小さくする
# 幅と高さを1/3にリサイズ
resized_img = cv2.resize(img, (img.shape[1] // 3, img.shape[0] // 3))  # img.shape(高さ, 幅, 色チャンネル数)

print('------')
print('カラー')
cv2_imshow(resized_img)

hachi.jpg

img = cv2.imread('hachi.jpg')この部分のファイル名は自分の好きな画像に置き換えてください。
ちなみにこれは、うちのはちわれちゃんが青森旅行に行った時の写真です。

3. 白黒にする

# グレースケールで読み込み
img2 = cv2.imread('hachi.jpg', cv2.IMREAD_GRAYSCALE)
resized_img2 = cv2.resize(img2, (img2.shape[1] // 3, img2.shape[0] // 3))
print('------')
print('グレースケール')
cv2_imshow(resized_img2)

gray.png
白黒になりました。これはこれでかわいいですね。

4. 画像処理を行う

im = img2

# 閾値設定による二値化処理
Threshold = 120
im[im < Threshold] = 0
im[im >= Threshold] = 255

# 特徴量フィルター生成
kernel = np.array([[0, -1, 0],
                   [-1, 4, -1],
                   [0, -1, 0]], dtype=np.uint8)

# 膨張処理
dilation = cv2.dilate(im, kernel, iterations = 3)
resized_dilation = cv2.resize(dilation, (dilation.shape[1] // 3, dilation.shape[0] // 3))
print('------')
print('膨張処理')
cv2_imshow(resized_dilation)
  • 画像の各ピクセルの輝度値をしきい値に基づいて白または黒に変換します。今回は120という値を基準に、120未満をすべて黒に、120以上をすべて白に設定しています。​
  • kernel部分では、画像の輝度の変化が大きい(つまりエッジにあたる)部分を強調します。​今回は中心のピクセル値を4倍し、周囲のピクセル値を引いています。
  • 膨張処理​はエッジを太くする操作です。​iterationsの値を増やして繰り返すことで、線がより濃くなります。

5. 完成

# 差分処理(膨張処理を行ったデータからグレースケール画像を引く)
Difference = dilation - im

# 色反転
Difference[:, :] = 255 - Difference[:, :]

# リサイズした画像を表示
resized_difference = cv2.resize(Difference, (Difference.shape[1] // 3, Difference.shape[0] // 3))
print('------')
print('差分処理')
cv2_imshow(resized_difference)

finish.png
​膨張処理を3回繰り返したことで、かなり綺麗に線画化することができました。
画像によって明るさなどが異なるので、お好きな画像に合ったしきい値やiterationsの値に変えてもらえれば綺麗に線画化できるかと思います。

おわりに

最後まで読んでくださりありがとうございました!
よかったら好きな画像に置き換えて遊んでみてください!

参考文献

1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?