この機能の簡易作業ソフトを作っていく。本日は途中段階
ガンマを変更するツール。マウスで指定した領域の近辺だけ、持ち上げるツール
ステップ0ファイルの入力と出力
ステップ1gammaを変更する。
ステップ2元の画像と見比べる
ステップ3特定の場所の周辺のガンマを変える関数を作る
ステップ4特定の領域のサイズと重みづけ関数とする
ステップ5マウスを置いた場所の周辺xx画素の範囲のみ行う
ステップ6ガンマ値をマウスのボタンを押している時間だけ明るくする。
ステップ7初期値は変更が必要な時だけパラメータを入れて変えられるようにする。
このような感じの順番で作っていく。
<ステップ0>ファイルの入力と出力
import numpy as np
import cv2
import sys
import os, tkinter, tkinter.filedialog, tkinter.messagebox
def f_opengui():
####以下は画像ファイルを選ぶ場合
root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
return file
img=cv2.imread(f_opengui(),1)
#元ファイルを表示
cv2.imshow('Base',img)
cv2.waitKey(1)
#ここに中身を入れていく。
img2=img
#ここに中身を入れていく。終わり
#保存と表示
cv2.imwrite('c:/temp/colorBox.jpg',img2)
cv2.imshow('After',img2)
cv2.waitKey(0)
#cv2.destroyAllWindows()これで、ファイルを読み込んで、何か加工してファイルを保存する、”土台”になります。
ステップ1gammaを変更する。
ステップ2元の画像と見比べる
ステップ3特定の場所の周辺のガンマを変える関数を作る
を加えます。そのコードがこちら。
import numpy as np
import cv2
import sys
import os, tkinter, tkinter.filedialog, tkinter.messagebox
def f_opengui():
####以下は画像ファイルを選ぶ場合
root = tkinter.Tk()
root.withdraw()
fTyp = [("","*")]
iDir = os.path.abspath(os.path.dirname(__file__))
file = tkinter.filedialog.askopenfilename(filetypes = fTyp,initialdir = iDir)
return file
img=cv2.imread(f_opengui(),1)
#元ファイルを表示
cv2.imshow('Base',img)
cv2.waitKey(1)
####以下は直接書き込みの場合
#基本の確認
#img=cv2.imread('c:/temp/ts.jpg',1)
img2=img #編集物入れ物
#取り込んだ絵のサイズ取得
xm=len(img)
ym=len(img[0])
zm=len(img[0,0])
print(xm,ym,zm)
#加工の準備 パラメータ取得 (パラメータは仮固定20230821)
#aa=int(input("黒引きaa= (何もしない場合0) "))
aa=0
#bb=int(input("白とびbb= (何もしない場合255) "))
bb=255
#nn=float(input("gamma nn= (何もしない場合1) "))
nn=0.3
print(aa,bb,nn)
#rr=int(input("範囲 rr= "))
rr=50
xpos=100
ypos=100
##############################################
#imgを加工
for yy in range(ym):
for xx in range(xm):
for zz in range(zm):
if rr**2>((xx-xpos)**2+(yy-ypos)**2): #円の領域
dd=((img[xx,yy,zz]/(bb-aa)-aa/(bb-aa))**nn)*255
if (dd)<0:
img2[xx,yy,zz]=0
elif (dd)>255:
img2[xx,yy,zz]=255
else:
img2[xx,yy,zz]=dd
zz=0
xx=0
#保存と表示
cv2.imwrite('c:/temp/colorBox.jpg',img2)
cv2.imshow('After',img2)
cv2.waitKey(0)
#cv2.destroyAllWindows()これで特定領域の階調を黒引きaa,白とびbb,ガンマnnで数値を入れて、特定の領域だけ階調を変えることができました。


白い部分の階調が持ち上がっているのがわかりますが、いまいち、価値がわかりづらいですね。
では次行きましょう。
ちなみに以下の本がお勧めです。

コメント