PyQt で画像のビューアを作る 6 version 8

2019/07/04 15:58 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
PyQt で画像のビューアを作る 6
@[TOC](長くなったので目次つけた)

190626
# ImageEnhancer (pillow 修正)
https://live.staticflickr.com/65535/48188518282_5360dbd707_b.jpg
左側でマスクを作って右側に適用したところ
https://live.staticflickr.com/65535/48188461336_bf4bd21cc0_b.jpg

<code>
<fig>

- pillowとQtの画像のやりとり変更
予定通りイケた、落ちなくなりました (・∀・)ノ
pillowのimageをQtで表示するときに、pillow側でQtimageクラスが用意されてて簡単に変換してくれる
ただこれが動作不安定の原因っぽいので使うのをやめた
pillowでバッファ上にBMPで書き出して、それをQt側で読み込むようにしただけで単純です
pillow側のQtimageクラスも以外とこれと同じ事をやってるのかもしれない

- pillowの記述変更
私が最初に試したのは古かったようだ
画質の調整はImageEnhanceクラスに統合されていて、使い方も統一されていて良くなってる
これに合わせて書き換えた
- 使い方が同じだからスクリプトももっと短く出来るはず
スライダーへのコネクト関数も一つにしたい
スライダー自体一つでも良いかもしれない、ラジオで分岐させれば
ここら辺の使いやすさちょっと微妙だけれど
- マスク付きの画像調整は基本出来てるし、動作も安定してきたのでこれからは作り込みじゃ
しかしこういう感じだと**進める動機付けが弱い**んだよなあ・・・・( ̄― ̄?)

## 雑感です
- 画質の調整はビューアとは別物なので分けて書くことにした
自作のビューアではdllにしてあって統合したんだけど
pythonに関しては多分これからも別のスクリプトのままだと思うし
- しかし日本語ではなんて訳すのかね?
google先生に聞いたらカタカナでイメージエンハンサーって返ってきた
やれやれ ┐('д')┌

----
190627
# Enhancer Qtでグラデ描画
- このソフトはここが重要、マスクを自在にかけるためにグラデを自由に描画したかった
**ほぼ予定通りに出来た**
この部分はQtのブラシを使った、pillowだと面倒らしいので
Qtはすごいね
Qpixmapからpillowへの変換が必要になるけどそこはこれから
<code>
<fig>
- グラデはパラメータが結構多いのでスライダーもたくさん作った
パラメータとスライダオブジェクトの組み合わせをリストで整理したらすっきり書けた
ただし**リストを使うと可読性は低い**よなあ
まあしかたないんだろうけど
- **楕円のグラデ**も書きたいんだけど無理かな
- 線形グラデにはまだ未対応
スライダーのパラメータへの割りふりは新しいリストを使って切り替えれば良いだけかもしれない
ラジオで切り替える
簡単かもしれない (・∀・)


---
190628-

# enhancer Qpixmapの変換、サブクラス化書き換え
## Qpixmapの変換
- Qtで描画したグラデをマスクとして使うためにpillowに変換 
調べておいたことを試しただけだけどうまくいった
ネットでは他のやり方も見たけど私のやり方で正解だと思う
QbufferとQbuffer.data()はほぼpythonのbytearray()と同じだ
## サブクラス化とオブジェクト指向
- グラデのラベルをサブクラス化
グラデパラメータをマウスでグリグリするためサブクラス化した
ついでにグラデの描画もサブクラスの中に持って行った
- やりたいことを試しながら何とか一つ一つは出来るようになった
しかしこのソフトはグラデを作ってそのグラデをマスクにして画質を調整していく
そこら辺をリアルタイムで連携してやるためにはアルゴリズムがしっかりしていないとだめだ
改めて考えると、**オブジェクト毎に機能をはっきり切り分けた方が良い**と思うようになった
その方がコードの流れがすっきりするし、他のルーチンとの関係もわかりやすい
- おおざっぱには、グラデ用のラベルをサブクラス化して
マウスによるパラメータの取得
グラデの描画
ラベルの表示
をこのクラスでやる方向にして書き換え中
右側とリアルタイムで連携することも出来るようになった(まだ途中だけど)
- オブジェクト指向的な考え方が少しわかったような気がしてきた
この方がわかりやすいしミスを発見しやすいし、他のルーチンに迷惑をかけづらいし分業もしやすい
ただどこからどこまでをクラスで書くかに決まりは無いだろうから、あとはセンスなんだろう、そこら辺もプログラミングの楽しさですね
## スライダー
- マウスでグラデを描画するようになるとスライダーの存在価値自体が今ひとつぼやけてくるが、スライダーもクラスで管理する方向
初期設定、スロットの受け、値をラベルクラスから受け取ること、逆に送ることも
## 右のラベルクラス
- こっちもサブクラス化した方が良さそうだな
特に描画部分はマスク画像の関係もあって複雑だからすっきり書き換えたい

# pillow の問題
- 実用化できそうな今になって気づいたんだけど、明るさの調整機能がおかしい
とうか、私の思ったような画質にならない
明るくするとコントラストも上がる感じになってしまう
ここら辺の理屈は画像のことを一から勉強しないとよくわからない気がするんだが、少なくとも希望とは違う
- 現在はPhotoLineでヒストグラムのカーブを上げるような調整を行ってるんだけど、これは結構難しいのかもしれない
- ということでpillow以外の別のモジュールを探したりしたがなかなかしっくりこない
というか、見栄え良く明るくするのって簡単じゃ無いんだなあと改めて思う
明るさ、コントラスト、彩度、全て絡む、多分
今のままでは多分実用化は難しい
プログラム的には進んできたのに肝心の部分dね行き詰まってきた
どうしたものか?( ̄― ̄?)?

----
190701
- ラベルのサブクラスと本体の連携をすっきり書き直し中
結構無駄なコードが多いことに気づく。その都度書き直してるが、やはり少しずつ書き足しのコードだとこういうことになるよな 
設計が大事って事ですね
まあ少しずつ試しながら進めるからこういうことにしかならない、どうしようもない部分もあるんだけどさ
- ただ最初からクラスを意識した書き方は出来たかもしれない
今後の課題っすね 
- **トーンカーブ**を実装したくていろいろ調べてるがよくわからない
openCVでも、もしかしたらpillowでもエンジンとしては使えるように思うんだけど、カーブをマウスでグリグリやる辺りがどうすれば良いのかわからん┐('д')┌
ここは画像処理ではなくて純粋にGUIの問題だなあ
以前画像にsvgの矢印を入れたとき、そもそもsvgの作成からやりたくて少し考えて諦めたテーマに近い
どうやって調べたら良いのかもわかんない
手がかりだけでも欲しいが・・・

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


----
→ [目次に戻る](https://mimemo.io/m/QORbW4qkvOoda0N)
      

長くなったので目次つけたImageEnhancer (pillow 修正)雑感ですEnhancer Qtでグラデ描画enhancer Qpixmapの変換、サブクラス化書き換えQpixmapの変換サブクラス化とオブジェクト指向スライダー右のラベルクラスpillow の問題

190626

ImageEnhancer (pillow 修正)


左側でマスクを作って右側に適用したところ

<code>
<fig>

  • pillowとQtの画像のやりとり変更
    予定通りイケた、落ちなくなりました (・∀・)ノ
    pillowのimageをQtで表示するときに、pillow側でQtimageクラスが用意されてて簡単に変換してくれる
    ただこれが動作不安定の原因っぽいので使うのをやめた
    pillowでバッファ上にBMPで書き出して、それをQt側で読み込むようにしただけで単純です
    pillow側のQtimageクラスも以外とこれと同じ事をやってるのかもしれない

  • pillowの記述変更
    私が最初に試したのは古かったようだ
    画質の調整はImageEnhanceクラスに統合されていて、使い方も統一されていて良くなってる
    これに合わせて書き換えた

  • 使い方が同じだからスクリプトももっと短く出来るはず
    スライダーへのコネクト関数も一つにしたい
    スライダー自体一つでも良いかもしれない、ラジオで分岐させれば
    ここら辺の使いやすさちょっと微妙だけれど

  • マスク付きの画像調整は基本出来てるし、動作も安定してきたのでこれからは作り込みじゃ
    しかしこういう感じだと進める動機付けが弱いんだよなあ・・・・( ̄― ̄?)

雑感です

  • 画質の調整はビューアとは別物なので分けて書くことにした
    自作のビューアではdllにしてあって統合したんだけど
    pythonに関しては多分これからも別のスクリプトのままだと思うし
  • しかし日本語ではなんて訳すのかね?
    google先生に聞いたらカタカナでイメージエンハンサーって返ってきた
    やれやれ ┐('д')┌

190627

Enhancer Qtでグラデ描画

  • このソフトはここが重要、マスクを自在にかけるためにグラデを自由に描画したかった
    ほぼ予定通りに出来た
    この部分はQtのブラシを使った、pillowだと面倒らしいので
    Qtはすごいね
    Qpixmapからpillowへの変換が必要になるけどそこはこれから
    <code>
    <fig>
  • グラデはパラメータが結構多いのでスライダーもたくさん作った
    パラメータとスライダオブジェクトの組み合わせをリストで整理したらすっきり書けた
    ただしリストを使うと可読性は低いよなあ
    まあしかたないんだろうけど
  • 楕円のグラデも書きたいんだけど無理かな
  • 線形グラデにはまだ未対応
    スライダーのパラメータへの割りふりは新しいリストを使って切り替えれば良いだけかもしれない
    ラジオで切り替える
    簡単かもしれない (・∀・)

190628-

enhancer Qpixmapの変換、サブクラス化書き換え

Qpixmapの変換

  • Qtで描画したグラデをマスクとして使うためにpillowに変換 
    調べておいたことを試しただけだけどうまくいった
    ネットでは他のやり方も見たけど私のやり方で正解だと思う
    QbufferとQbuffer.data()はほぼpythonのbytearray()と同じだ

サブクラス化とオブジェクト指向

  • グラデのラベルをサブクラス化
    グラデパラメータをマウスでグリグリするためサブクラス化した
    ついでにグラデの描画もサブクラスの中に持って行った
  • やりたいことを試しながら何とか一つ一つは出来るようになった
    しかしこのソフトはグラデを作ってそのグラデをマスクにして画質を調整していく
    そこら辺をリアルタイムで連携してやるためにはアルゴリズムがしっかりしていないとだめだ
    改めて考えると、オブジェクト毎に機能をはっきり切り分けた方が良いと思うようになった
    その方がコードの流れがすっきりするし、他のルーチンとの関係もわかりやすい
  • おおざっぱには、グラデ用のラベルをサブクラス化して
    マウスによるパラメータの取得
    グラデの描画
    ラベルの表示
    をこのクラスでやる方向にして書き換え中
    右側とリアルタイムで連携することも出来るようになった(まだ途中だけど)
  • オブジェクト指向的な考え方が少しわかったような気がしてきた
    この方がわかりやすいしミスを発見しやすいし、他のルーチンに迷惑をかけづらいし分業もしやすい
    ただどこからどこまでをクラスで書くかに決まりは無いだろうから、あとはセンスなんだろう、そこら辺もプログラミングの楽しさですね

スライダー

  • マウスでグラデを描画するようになるとスライダーの存在価値自体が今ひとつぼやけてくるが、スライダーもクラスで管理する方向
    初期設定、スロットの受け、値をラベルクラスから受け取ること、逆に送ることも

右のラベルクラス

  • こっちもサブクラス化した方が良さそうだな
    特に描画部分はマスク画像の関係もあって複雑だからすっきり書き換えたい

pillow の問題

  • 実用化できそうな今になって気づいたんだけど、明るさの調整機能がおかしい
    とうか、私の思ったような画質にならない
    明るくするとコントラストも上がる感じになってしまう
    ここら辺の理屈は画像のことを一から勉強しないとよくわからない気がするんだが、少なくとも希望とは違う
  • 現在はPhotoLineでヒストグラムのカーブを上げるような調整を行ってるんだけど、これは結構難しいのかもしれない
  • ということでpillow以外の別のモジュールを探したりしたがなかなかしっくりこない
    というか、見栄え良く明るくするのって簡単じゃ無いんだなあと改めて思う
    明るさ、コントラスト、彩度、全て絡む、多分
    今のままでは多分実用化は難しい
    プログラム的には進んできたのに肝心の部分dね行き詰まってきた
    どうしたものか?( ̄― ̄?)?

190701

  • ラベルのサブクラスと本体の連携をすっきり書き直し中
    結構無駄なコードが多いことに気づく。その都度書き直してるが、やはり少しずつ書き足しのコードだとこういうことになるよな
    設計が大事って事ですね
    まあ少しずつ試しながら進めるからこういうことにしかならない、どうしようもない部分もあるんだけどさ
  • ただ最初からクラスを意識した書き方は出来たかもしれない
    今後の課題っすね
  • トーンカーブを実装したくていろいろ調べてるがよくわからない
    openCVでも、もしかしたらpillowでもエンジンとしては使えるように思うんだけど、カーブをマウスでグリグリやる辺りがどうすれば良いのかわからん┐('д')┌
    ここは画像処理ではなくて純粋にGUIの問題だなあ
    以前画像にsvgの矢印を入れたとき、そもそもsvgの作成からやりたくて少し考えて諦めたテーマに近い
    どうやって調べたら良いのかもわかんない
    手がかりだけでも欲しいが・・・

→ 目次に戻る