疑似ベイヤー配列でデモザイクを体験してみる

import cv2
from matplotlib import pyplot as plt
from tkinter import filedialog
import numpy as np
import os


# ファイル選択
fTyp = [("", "*")]
iDir = ""
file_name = filedialog.askopenfilename(filetypes=fTyp, initialdir=iDir)
print(file_name)

# 画像読み込み
if file_name == "":
    exit()
im = cv2.imread(file_name)
if im is None:
    exit()
    

# モザイク画像の配列
mz = np.empty((im.shape[0],im.shape[1]),"uint8")

# モザイク化
# |G|B|
# |R|G|
for idx_x in range(im.shape[1]//2 -1):
	for idx_y in range(im.shape[0]//2 -1):
		# opencvはBGR

		# 0,0 をGのみに
		im[idx_y*2][idx_x*2][0] = 0
		im[idx_y*2][idx_x*2][2] = 0
		mz[idx_y*2][idx_x*2] = im[idx_y*2][idx_x*2][1] 

		# 0,1 をBのみに
		if im.shape[0] > idx_y*2 +1 :
			im[idx_y*2 +1][idx_x*2][0] = 0
			im[idx_y*2 +1][idx_x*2][1] = 0
			mz[idx_y*2 +1][idx_x*2] = im[idx_y*2 +1][idx_x*2][2]
	
 		# 1,0 をRのみに
		if im.shape[1] > idx_x*2 +1 :
			im[idx_y*2][idx_x*2 +1][1] = 0
			im[idx_y*2][idx_x*2 +1][2] = 0
			mz[idx_y*2][idx_x*2 +1] = im[idx_y*2][idx_x*2 +1][0]
  
		# 1,1 をGのみに
		if im.shape[1] > idx_x*2 +1 and im.shape[0] > idx_y*2 +1 :
			im[idx_y*2 +1][idx_x*2 +1][0] = 0
			im[idx_y*2 +1][idx_x*2 +1][2] = 0
			mz[idx_y*2 +1][idx_x*2 +1] = im[idx_y*2 +1][idx_x*2 +1][1]


# デモザイクした2次元配列を表示
#cv2.imshow("test",mz)
#key = cv2.waitKey(0)

# ベイヤー化したものを保存
splitname = os.path.split(file_name)
print(splitname[0] + "/" +"bayerd_"+ os.path.splitext(splitname[1])[0] + ".png")
cv2.imwrite(splitname[0] + "/" +"bayerd_"+ os.path.splitext(splitname[1])[0] + ".png",im )


# ベイヤー化したものを表示
#plt.imshow(cv2.cvtColor(im, cv2.COLOR_BGR2RGB))
#plt.show()


# デモザイク
#color_img = cv2.cvtColor(mz, cv2.COLOR_BayerGR2BGR)
color_img = cv2.cvtColor(mz, cv2.COLOR_BayerGR2BGR_VNG)


# デモザイクしたものを表示
#plt.imshow(cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB))
#plt.show()

# デモザイクしたものを再保存
cv2.imwrite(splitname[0] + "/" +"demosaic_"+ os.path.splitext(splitname[1])[0] + ".png",color_img )

python3.10.11 がメインPCに入っていたので、それ使って処理を書いてみました。
1. opencvで画像をnumpy配列に格納してもらって
2. BGRをちまちまforループで書き換えてカラーのベイヤー配列再現画像に変えつつ、色情報を持たない配列を別に用意して実際のベイヤー配列として保存
3. openvcが提供してくれる色空間の変換関数を使ってデモザイク
という流れ


左が元画像、右がベイヤー化したものを再度デモザイク処理で通常画像に戻したもの

一緒やん。

実際に適当にデスクトップにあった画像を食わせてみましたが、滅茶苦茶ちゃんと出てきて引きました。一度情報量が1/3まで削られたはずでは・・・?

とてもズームした状態でもエッジがあるところで少し典型的な偽色が出ている事は確認できますが、それ以外は本当に分からないレベル。(トップのtwitterの画像参照)

差を見たくなったので、画像編集ソフトで差を取って、見やすいように画像加工

ほぼ黒い=差がない ってことです。これでもめちゃくちゃ明るくする方に加工してます。
差が出るのはやはりエッジがあるところ。
特に翼と窓、光源に差が発生してる感じがしますね。

さて、本命のfoveonセンサーが吐いてきた解像感ゴリゴリの画像を食わせるとどうなのか。

岩のテカり感があるところで盛大に偽色が発生してる感じです。葉っぱのエッジも結構妙な模様が出てる感じがしますね。

差も無加工で分かるぐらいには結構あります。

バチバチに解像感がある画像ではベイヤー化すると厳しいものがありそうです。不自然な偽色を抑えようとするとエッジは甘くならを得なくなるはず。
あんまり画像載せるのも良くないので控えますが、普通の風景なんかではさほど変わらず。
個人的にはfoveonの特徴だと思っていた光沢感が凄い画像でもあまり差は出ず。デモザイクはあんまり関係ないらしい。

ベイヤーセンサ、デモザイク処理で非常に良い結果を得られることを体験できたのはとても良かったなと思います。
Foveonセンサーが優位に立つのはこういう所だってことも分かったので強味を生かしていきたいですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です