環境
windows8.1
python3.4.4
opencv3.1.0
概要
カラー画像を読み込み、水彩錯視を作ります。
水彩錯視というのは、絵画や写真の輪郭にのみ色をのせることで、
実際には色のない領域もうっすらと色づいて見える現象・・・
と、視覚については話すと長くなりますので、リンクをいくつか紹介します。
水彩錯視の例も掲載されています。
エッジに起因する明暗と色の錯視 - 新井仁之のホームページ
Illusion Forum
CVRM
画像
今回使用する画像は、ご存知「いらすとや」さんより
なるたけ多彩な画像を血眼で探しました
本体
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で実行
出力
諸々
エッジ検出は関数が用意されているので簡単です。
ただ、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.