昔の写真とネガを整理していて、写真とネガが別々に保存していました。このため、ネガイメージからだとどのネガがどの写真に対応しているのか、確認が難しいです。そこで、OpenCV + Python を使って、ネガポジ変換を行ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import numpy as np import cv2 cap = cv2.VideoCapture(0) w = cap.get(cv2.CAP_PROP_FRAME_WIDTH) h = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) fps = cap.get(cv2.CAP_PROP_FPS) ret, frame = cap.read() farray = np.array(frame, dtype=np.float) while True: ret, frame = cap.read() if frame is None: break wb = frame inv = cv2.bitwise_not(frame) <em># White Balance の計算</em> wb[:,:,0] = np.clip((inv[:,:,0] - 45.0) * 255.0 / 140.0, 0, 255) <em># b</em> wb[:,:,1] = np.clip((inv[:,:,1] - 55.0) * 255.0 / 120.0, 0, 255) <em># g</em> wb[:,:,2] = np.clip((inv[:,:,2] - 55.0) * 255.0 / 120.0, 0, 255) <em># r</em> img_hsv = cv2.cvtColor(wb,cv2.COLOR_BGR2HSV) <em># 色空間をBGRからHSVに変換</em> h_magnification = 1.0 <em># 色度(Hue)の倍率</em> s_magnification = 1.5 <em># 彩度(Saturation)の倍率</em> v_magnification = 1.0 <em># 明度(Value)の倍率</em> img_hsv[:,:,(0)] = np.clip(img_hsv[:,:,(0)]*h_magnification, 0.0, 255.0) <em># 彩度の計算</em> img_hsv[:,:,(1)] = np.clip(img_hsv[:,:,(1)]*s_magnification, 0.0, 255.0) <em># 彩度の計算</em> img_hsv[:,:,(2)] = np.clip(img_hsv[:,:,(2)]*v_magnification, 0.0, 255.0) <em># 明度の計算</em> res = cv2.cvtColor(img_hsv,cv2.COLOR_HSV2BGR) <em># 色空間をHSVからBGRに変換</em> cv2.imshow('Frame', res) if cv2.waitKey(30) == 27: break cap.release() cv2.destroyAllWindows() |
単純に、ネガポジ変換だけだと、全体的に青みがかった画像になり、思った色になりませんでした。そこで、青みがかった色を修正するために、ホワイトバランスの修正を行っています。これは、照明、撮像デバイス、ネガなどにより、パラメータを調整する必要があります。
ホワイトバランスは、単純にRGBのフィルムを通過した光のダイナミックレンジを一次式で正規化しているだけです。
つぎに、彩度が薄い感じだったので、RGBをHSV に変換し、彩度を1.5倍に上げてから、RGBに戻しています。これでだいたい何が写っているのか判別できるようになりました。
ほかの照明や撮像デバイスが異なると、色合いがおかしくなったりすると思いますが、地道にパラメータを調整する必要があります。