PyQt で画像のビューアを作る 7 version 1

2019/07/04 17:00 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
PyQt で画像のビューアを作る 7
- pillow の明るさが嫌なのでトーンカーブのことを調べだした

----
190702
# ベジェ曲線をグリグリしてみた
- マスクでenhanceは出来たんだけど肝心のpillowのenhanceが不満で、いろいろ調べてるうちにトーンカーブでピクセルを補正していくしかないような気がしてきた
- で、まずはマウスでグリグリ曲線を描くにはどうしたら良いのだろうと思い、Qtでベジェを書く実験をしたら結構簡単にできた
でもこの曲線を数学の関数として扱って、与えられたxに対してYを返さなければいけないがやり方がわかんない┐('д')┌
調べればわかるんだろうけど、そもそもベジェを書くことが目的では無いことに気づいた( ´∀`)
まあ楽しかったしこれでパスオブジェクトを作れるようになったのでどこかでまたやろう
- トーンカーブの実装には多分別のアプローチが必要
右上がりの直線を書いて、そこにポイントを追加してなめらかな曲線にする、これは多分スプライン補間って分野だ
python ってそういう数学的なものは得意らしい
scipy ってのを早速インストしてみたので調べてやってみよう

----
190704
# トーンカーブの実装
- 右上がりの直線を描いてマウスで上に持ち上げたら線が上に膨らんで画像も明るくなるって感じ
トーンカーブですね、とりあえず出来た(・∀・)ノ

## スプライン補間した関数を取得
- scipy君に頼んで何とか出来たが、よくみる
interpolate.interp1d(x, y, kind="cubic" ) 
これだとエラーになる
cubic の場合、与える**xがある程度均等に並んでる**必要があるみたいだ
トーンカーブは始点と終点は固定で、中間の任意の点を上げ下げする
こうした三点を与えても計算出来ないんだと思う
- でドキュメントを読んで kind パラメータを順に試したら、
interpolate.interp1d(x, y, kind=**"quadratic"** ) 
これでイケました
試行錯誤なので理屈はわかってませんが( ´∀`)
- この関数さえ出来ればLUTを作るのは単純作業で簡単
- LUTを元にドットを描画するように曲線を描くことに成功


## 画像に適用
- で、LUTを元にpillowでピクセルを補正して表示することに成功
- これは簡単だったんだけど、getpixcelだと遅くて使えない┐('д')┌
- せっかくscipyをインストしたのでそれについてきたNumpyでやってみたが、arrayを一括で上げようとしてもうまくいかない
このサイトの情報だと、Numpyよりもpillowのgetdataが速いって事だったので試したら何とかイケた

- getdata はピクセルデータを縦*横の数の一列のリストで取得できる
単純に全てのデータをLUTによって変換して新しいデータを作って、もとのpillowにputdata()で戻してやればOK
ちなみにこのデータはリストだけどそれぞれの要素はタプルで返すことに注意



      
  • pillow の明るさが嫌なのでトーンカーブのことを調べだした

190702

ベジェ曲線をグリグリしてみた

  • マスクでenhanceは出来たんだけど肝心のpillowのenhanceが不満で、いろいろ調べてるうちにトーンカーブでピクセルを補正していくしかないような気がしてきた
  • で、まずはマウスでグリグリ曲線を描くにはどうしたら良いのだろうと思い、Qtでベジェを書く実験をしたら結構簡単にできた
    でもこの曲線を数学の関数として扱って、与えられたxに対してYを返さなければいけないがやり方がわかんない┐('д')┌
    調べればわかるんだろうけど、そもそもベジェを書くことが目的では無いことに気づいた( ´∀`)
    まあ楽しかったしこれでパスオブジェクトを作れるようになったのでどこかでまたやろう
  • トーンカーブの実装には多分別のアプローチが必要
    右上がりの直線を書いて、そこにポイントを追加してなめらかな曲線にする、これは多分スプライン補間って分野だ
    python ってそういう数学的なものは得意らしい
    scipy ってのを早速インストしてみたので調べてやってみよう

190704

トーンカーブの実装

  • 右上がりの直線を描いてマウスで上に持ち上げたら線が上に膨らんで画像も明るくなるって感じ
    トーンカーブですね、とりあえず出来た(・∀・)ノ

スプライン補間した関数を取得

  • scipy君に頼んで何とか出来たが、よくみる
    interpolate.interp1d(x, y, kind="cubic" )
    これだとエラーになる
    cubic の場合、与えるxがある程度均等に並んでる必要があるみたいだ
    トーンカーブは始点と終点は固定で、中間の任意の点を上げ下げする
    こうした三点を与えても計算出来ないんだと思う
  • でドキュメントを読んで kind パラメータを順に試したら、
    interpolate.interp1d(x, y, kind="quadratic" )
    これでイケました
    試行錯誤なので理屈はわかってませんが( ´∀`)
  • この関数さえ出来ればLUTを作るのは単純作業で簡単
  • LUTを元にドットを描画するように曲線を描くことに成功

画像に適用

  • で、LUTを元にpillowでピクセルを補正して表示することに成功

  • これは簡単だったんだけど、getpixcelだと遅くて使えない┐('д')┌

  • せっかくscipyをインストしたのでそれについてきたNumpyでやってみたが、arrayを一括で上げようとしてもうまくいかない
    このサイトの情報だと、Numpyよりもpillowのgetdataが速いって事だったので試したら何とかイケた

  • getdata はピクセルデータを縦*横の数の一列のリストで取得できる
    単純に全てのデータをLUTによって変換して新しいデータを作って、もとのpillowにputdata()で戻してやればOK
    ちなみにこのデータはリストだけどそれぞれの要素はタプルで返すことに注意