4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python3とopenCV3のエッジ検出で水彩錯視を描く

Last updated at Posted at 2016-10-19

環境

 windows8.1
 python3.4.4
 opencv3.1.0

概要

カラー画像を読み込み、水彩錯視を作ります。

水彩錯視というのは、絵画や写真の輪郭にのみ色をのせることで、
実際には色のない領域もうっすらと色づいて見える現象・・・
と、視覚については話すと長くなりますので、リンクをいくつか紹介します。
水彩錯視の例も掲載されています。

エッジに起因する明暗と色の錯視 - 新井仁之のホームページ
Illusion Forum
CVRM

画像

今回使用する画像は、ご存知「いらすとや」さんより

「特産品」
test1.png

なるたけ多彩な画像を血眼で探しました

本体

edge.py
import numpy as np
import cv2

"""
環境:python3.4.4 openCV
元の画像 : image_name
保存する画像: out_name
image_nameを水彩錯視に変換して出力
"""

image_name = 'test1.png'
out_name = 'out1.png'


# 画像の読み込み
Img0 = cv2.imread(image_name)


# 後のマスクと都合を合わせるため画像は白黒反転
negImg = 255 - Img0


# 画像のサイズを取得し、輪郭の太さを指定
ImgHeight, ImgWidth = Img0.shape[:2]
# 縦横長い方/200 + 1
if ImgWidth > ImgHeight:
	lineWeight = ImgHeight // 200 + 1
else:
	lineWeight = ImgWidth // 200 + 1


# エッジを取得(二段階の閾値100 200)
# 後から太さの違う輪郭を2つ合わせるので、2つのimageを用意する
edgeImg1 = cv2.Canny(Img0,100,200,4)
edgeImg2 = cv2.Canny(Img0,100,200,4)


# 黒い背景から物体(白)の輪郭を検出する
image1, contours, hierarchy = cv2.findContours(edgeImg1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
image2, contours, hierarchy = cv2.findContours(edgeImg2,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)


# 黒の輪郭
edge = cv2.drawContours(image1, contours, -1, (255,255,255), 1)
# 黒の輪郭周りの色(水彩の素)
mask1 = cv2.drawContours(image2, contours, -1, (255,255,255), lineWeight)


# edgeは黒地に白なので反転して表示
negEdge = 255- edge


# 反転画像をマスクで切り取る
negColor = cv2.bitwise_and(negImg, negImg, mask=mask1)


# 切り取った反転画像を再び反転
Color = 255-negColor


# 出力する画像
output = cv2.bitwise_and(Color, Color, mask=negEdge)
cv2.imshow('image', output)

# escキーを押すと終了
# sを押すと保存する
k = cv2.waitKey(0) & 0xFF
if k == 27:
    cv2.destroyAllWindows()
elif k == ord('s'):
    cv2.imwrite('out01.png',output)

# python edge.pyで実行

出力

いかがでしょう。色づいて見えるでしょうか?
out01.png

諸々

エッジ検出は関数が用意されているので簡単です。

ただ、Canny()によるエッジ検出は二つの閾値だけを基準にしているので、人間の目のように微妙な境界判断はできません。そんなわけで、人参の葉が消えたり、稲が一体化してよく分からないつぶつぶの豆みたいになってしまっているわけです。

もう一つ、反転を繰り返しているのはあまり賢い方法ではありません。
しかし、黒のエッジを残したり、エッジ以外を白くしようといじっていたら結果このようになりました。背景を白くすることができれば、もう少し簡単になるのですが・・・

参考

いらすとや
OpenCV-Python Tutorials 1 documentation
Pythonの学習の過程とか
Pinna, B., Brelstaff, G., and Spillmann, L. (2001) Surface color from boundaries: a new ‘watercolor’ illusion. Vision Research, 41, 2669-2676.

4
6
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
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?