hirax.net::Keywords::「画像処理」のブログ



2015-11-13[n年前へ]

グラビアアイドルの肌を魅力的にする画像処理 

 「愛川ゆず季」のグラビア写真を、さらに(個人の趣味はあれど)魅力的に美しく透明にしてみました。行った作業はとても簡単で、久保尋之らの"曲率に依存する反射関数を用いた半透明物体の…"を踏まえ、肌色領域を抽出した上、ランバート反射物体のコサイン関数に比例する輝度を分布を(RGBの波長違いを踏まえて)変化の少ない階調変換を掛けることで、グラビアアイドルの肌を魅力的にする画像処理を掛けてみた…という具合です。

 下のモーフィング動画は、元画像を「魅力的画像」に変化させてみたものです。こうした処理は、昔から手作業で行われていたものと本質的に同じですが、そうした処理の原理・理屈を納得した上で行ってみると、結構面白く感じるものです。

 ちなみに、この「グラビアアイドルの肌を魅力的にする画像処理」を倉持由香の写真に掛けて眺めたのがリンク先です。こうした機能を(人の好みに合わせたカスタマイズ機能付きで)ブラウザ標準機能にすると喜ばれるかもしれません。

2015-12-20[n年前へ]

「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」に変身させてみよう!? 

 夏が終わる頃、「CNN(Convolution Neural Network)を使い、さまざまな画風を簡単に再現する"A Neural Algorithm of Artistic Stlye"」が注目を集めました。「スタイル行列」という単純な考え方を用いることで、いとも簡単にさまざまなスタイルの絵を描き出すことができるのが、とても新鮮な論文でした。

 今日は、グラビアアイドルの「磯山さやか」をさまざまな画風で描き出してみました。その結果が、たとえば下に貼り付けた画像群です。ちなみに、ここに登場している「磯山さやか」はこんなメンバーです。

  1. フランス印象派風なルノワール画風
  2. (ある年代には村下孝蔵の”初恋”ジャケットで通じそうな)切り絵作家の村上保
  3. マティス
  4. ゴッホ
  5. 滝平二郎
  6. ルノワール

 個人的には、体系スタイル的には「ぽっちゃり」で肉体の存在感がある磯山さやかの体は、ボッティチェリ、ルノワール、あるいはマティスの画風により描き出すのがハマってるような気がします。

「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?「ポッチャリ磯山さやか」を「ボッティチェリ磯山さやか」にしてみよう!?






2016-12-12[n年前へ]

「君の名は。」画風変換アプリをPython/OpenCVで書いてみよう! 〜意外に空変換は簡単? 編〜 

 先月下旬頃、映画「君の名は。」画風変換アプリEverfilterが流行っていた。軽く遊んでみた印象は、「空領域抽出処理に破綻が少なく(適切で)、その処理はおそらく普通の枯れた方法を使って、画面の4端辺から領域判定を独立にかけてる」ように感じられた。

 そこで、普通にやりそうなコードを書いてみたら、空領域抽出がどのくらいの品質が得られるか、確かめてみることにした。手っ取り早く試してみたいというわけで、Python/OpenCVコードを書いてみた。このコードは、入力画像と(入れ替え用の)空画像を読み込んで、グラフカットアルゴリズムが実装されたOpenCVのGrabCut関数を使い、(空がある程度の面積を占めていそうな)画面上半分の領域を対象として空領域を抽出し、その領域に空を合成するという処理を行うものだ。その処理例が、たとえば下に貼り付けた「バンコクの昼風景を夜空の下の街に入れ替えた画像」のようになる(上が入力画像、下が出力画像)。

 コードを書いて・試してみた印象は、OpenCVのGrabCut関数を使う程度でも、十分破綻の少ない空領域抽出を行うことができそうで、枯れた(枯れつつある)技術は便利だ!というものだ。実際のところ、「君の名は。」画風変換アプリ程度であれば、使用データ群(入れ替え用画像群)抽出処理も含めて、数日掛からず作ってしまいそうな気がする。

import cv2
import numpy as np

img = cv2.imread("bangkok1s.jpg")
mask = np.zeros(img.shape[:2],np.uint8)
skyimg = cv2.resize(cv2.imread("Starsinthesky.jpg"),
                         img.shape[1::-1]) 
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
rect = (0,0,img.shape[1],round(img.shape[0]*0.7))
cv2.grabCut(img,mask,rect,bgdModel,fgdModel,
                      50,cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
mask2 = cv2.blur(mask2,(5,5))
img2 = img*(1-mask2[:,:,np.newaxis])
skyimg = skyimg*mask2[:,:,np.newaxis]
img3 = cv2.addWeighted(skyimg, 1, img2, 1, 2.5)
cv2.imwrite("out.jpg",img3)
cv2.imshow("preview",img3)
cv2.waitKey()

「君の名は。」画風変換アプリをPython/OpenCVで書いてみよう! 〜意外に空変換は簡単? 編〜「君の名は。」画風変換アプリをPython/OpenCVで書いてみよう! 〜意外に空変換は簡単? 編〜






2016-12-23[n年前へ]

Python/OpenCVで画像多重解像度解析コードを書いてみる 

 多重解像度解析…といっても直交基底に分解するというような話ではなくて、単に各周波数帯の特性がどの程度含まれるかを眺めるといった用途なら(つまり、ガボール変換やSTFTを掛ける感じの程度の用途なら)、Python/OpenCVを使って十数行で書けるかも?と思い書いてみました。もちろん、実装は簡単第一最優先!というわけで、ガウシアンフィルタ差分で2次元のバンドパスを作成し、それを周波数軸で重ねて眺めてみるというくらいの話です。

 実際に書いてみたら、ポスト処理含めて約20行くらいになりました。超入門的な画像処理コードですが、1次元〜2次元の多重解像度解析や周波数解析を行うことは意外に多いような気もするので、適当に貼り付けておくことにします。*


*画像処理クラスタからのコメント:
 ・マルチスケールで眺めるなら、DCゲイン1同士のガウシアン差分をとり、そのL2ノルムを1に正規化しすべし。
 ・周波数軸は等比的にした上で、ボリューム的表示も等比的比率で重ねたい。

import numpy as np
import cv2
from matplotlib import pyplot as plt

def DOG(img, s, r):
    img2=img.astype('uint16')
    img2=img2*128+32767
    gs = cv2.GaussianBlur(img2,(0, 0), s)
    gl = cv2.GaussianBlur(img2,(0, 0), s*r)
    return cv2.absdiff(gs, gl)

img = cv2.imread("sample2.jpg",0 )
(h,w)=img.shape
pts1 = np.float32([[0,0],[w,0],[w,h],[0,h]])
pts2 = np.float32([[0,h*1/4],[w*3/4,h*1/4],
                   [w,h*3/4],[w*1/4,h*3/4]])
M = cv2.getPerspectiveTransform(pts1,pts2)
baseImg = cv2.warpPerspective(
    img.astype('uint16'),M,(w,h))

for i in range(100,5,-10):
    pts1 = np.float32([[0,0],[w,0],[w,h],[0,h]])
    pts2 = np.float32([[0+i,h*1/4-i],
    [w*3/4+i,h*1/4-i],[w+i,h*3/4-i],[w*1/4+i,h*3/4-i]])
    M = cv2.getPerspectiveTransform(pts1,pts2)
    img2 = cv2.warpPerspective(DOG(img, i, 1.05),M,(w,h))
    baseImg = cv2.addWeighted(baseImg, 0.9, img2, 0.3, 0)

plt.figure(figsize=(6,6))
plt.imshow(np.array(baseImg)) 
plt.autoscale(False)

Python/OpenCVで画像多重解像度解析コードを書いてみる






2017-01-08[n年前へ]

ネット画像から有名人の個人情報(静脈パターン)を可視化してみよう!? 

 SNSなど投稿した「ピースマークなどの指写真」から指紋を推定する記事「指紋がネットで狙われている! 手の画像は悪用恐れ… 国立情報学研が新技術の実用化目指す」を読みました。写真の解像度が高ければ、指紋の抽出は確かにできそうです。もっとも、2017年時点の、よくある撮影解像度やアップロード画像解像度を考えると、指紋抽出はまだ困難な気がします。

 撮影の解像度だけを考えれば、皮膚内での波長毎の吸収・散乱特性の違いによる静脈可視化の方が楽かもしれません。掌を走る静脈は、その模様が人ごとに違うため、個人認証機器に多く使われたりします。そこで、各波長(RGB画像)の特性の違いを利用して、静脈推定をしてみることにしました。

 まずはネット上から掌が映った写真を探してみることにします。有名人の掌が映った写真はとても多く、観客に手を振る写真・演説中に両手の掌を開いて聴衆に見せている写真など、さまざまなパターンの画像が手に入ります。

 そして、静脈を可視化するために色の違いを利用するとなると、重要なことは「圧縮率が低い画像を探す」ということです。なぜかというと、人の視覚系は明度に対しては敏感ですが、色の違いに対しては解像力が低いため、多くの画像ファイルでは色情報が圧縮され低解像度になっているからです。

 圧縮率が低く・掌が映った有名人画像を探してみると、まず最初に見つかったのが綾瀬はるかさんの写真です(下左図)。この画像に「静脈部分を抽出する画像処理」を掛けてみると、皮膚下を走る静脈が浮かび上がってきます(下右図)。

 静脈模様を可視化する用途には、ネットにアップロードされている画像では圧縮率が問題になります。しかし、自分で撮影する画像なら、撮影さえすれば、圧縮が掛かっていない画像が手に入ります。…ということは、個人情報を狙われやすい有名人の人は、静脈模様を覆い隠す「静脈盗撮防止用のコンシーラー」などが必需品になるかもしれません。



■Powered by yagm.net