Pythonで作りたいものを作る!No001、ローカルガンマ処理ツール。vol1 構成を考える。

この機能の簡易作業ソフトを作っていく。本日は途中段階

ガンマを変更するツール。マウスで指定した領域の近辺だけ、持ち上げるツール

ステップ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で数値を入れて、特定の領域だけ階調を変えることができました。

白い部分の階調が持ち上がっているのがわかりますが、いまいち、価値がわかりづらいですね。

では次行きましょう。

ちなみに以下の本がお勧めです。

コメント

タイトルとURLをコピーしました