hogeoge enhancer version 26
:追加された部分
:削除された部分
(差分が大きい場合、文字単位では表示しません)
hogeoge
todo
ホワイトポイント取得、範囲外は無視する
```
r=QRect( QPoint(0,340) , QPoint( self.imag.width , self.img.height )
if not r.contains(e.pos()) :
return
```
# 実験
ベジェウィジェットで、終点を255.255でなく早めに255に着くようにする
この場合のLUTのドット描画がパスと同じ軌跡になるか確認
255で割る必要ないのに多めに割ってることになるからテーブルはいいのか?
第二段階テーブルの頂上以上が少し変になるはず
第二段階は、一旦255に達したらずっと255になるように書き換えるか?
- 第二段階の前にtempに一つデータを追加する [temp[-1][0]+1 , 255]
余分だけど他に悪さはしないと思うが???
# ウイジェットのスライダー
**ここにコネクトか!!!!**
actionTriggered (int)
void actionTriggered(int)これはこの信号のデフォルトのオーバーロードです。
このシグナルは、スライダーアクションアクションがトリガーされたときに発行されます。 アクションは、SliderSingleStepAdd、SliderSingleStepSub、SliderPageStepAdd、SliderPageStepSub、SliderToMinimum、SliderToMaximum、およびSliderMoveです。
シグナルが発行されたときは、アクションに従ってsliderPositionが調整されていますが、値はまだ伝達されておらず(valueChanged()シグナルがまだ発行されていないことを意味します)、ビジュアル表示は更新されていません。
このシグナルに接続されているスロットでは、アクションとスライダーの値の両方に基づいて、setSliderPosition()を自分で呼び出すことで任意のアクションを安全に調整できます。
----
----
# ホワイトポイント補正の延長
今は白に補正しているが、任意の色に補正したい(肌色を保存しておきたい)
HSV全て調節できるようにしたい
- 任意のポイントを特定色に変える
人間の頬のいろを合わせるとか
- ヒストグラムの頂上を合わせるルーチンがあったのでそれ変形は?
カラーを二つ渡したら色毎に変換テーブルを作って、画像を変換してself.enhanced にセットして描画する
ルーチンを作る
```
def convertcolor(self,c1,c2) : # arg-->QColor
c1=[c1.red(),c1.green(),c1.blue()]
c2=[c2.red(),c2.green(),c2.blue()]
c1=[120,180,50] # original color
c2=[150,50,200] # target color
v=[ [ c2[i] /c1[i] , (255-c2[i]) / (255-c1[i]) , 255*(1-((255-c2[i]) / (255-c1[i]))) ] for i in range(3)]
t=[ [round(i*v[l][1]) if i < c1[l] else round(i*v[l][1]+v[l][2]) for i in range(256)] for l in range(3) ]
```
- これで変換テーブルは出来たから後は描画するだけのはず
- しかし、色変換は色相は維持されない、ピンポイント近くの色はうまく変換されるが他の色はおかしくなるような??
白変換だからうまくいくのではないだろうか?
---
# 三色独立したベジェカーブ
・フォルダを全く別に作って開発しよう、ベースは引き継ぐが不要なクラスは削除
・現在のUIを変更、下にカーブを三つおいた。左に元画像を置く
・ベジェクラスは最初に本体から自分の色をもらって、その色でカーブを描画して本体にbezierポイントをemitする
・本体の受けは rgbconvert(point,color) 、もらった色のLUTを作成してすぐ画像を変換してupdateする
( self.img → self.enhanced )
・変換テーブルは self.LUT[[256],[256],[256]] で、initで直線データで初期化しておく
**ベジェクラス**
setcolor
rgbの色情報を親からもらってself.cにセットする r:g:b --> 0:1:2
reset
ベジェ曲線のリセット
setpoint
親からポイントをもらう(連動するため、このときはシグナルは送らない)
makeLUT
ポイントを元にLUTを計算して、Y軸補正したリストを親にemitする、このLUTでベジェを描画する
s:changep
親にポイントを送るシグナル
colorchanged = pyqtSignal( list )
**本体**
init
self.LUT=[ [i for i in range(256)] for l in range(3) ]
setbeziecolor
三つに色を割り当てる
rgbconvert(self,list,color)
self.LUT[color]=list
・マスクをかけないので enhanced と current は等しいから、どっちか削除でも良いかな
---
# ヒストグラムの単純な平行移動ルーチンを作りたい
```
# 初期化
self.LUT = [ [i for i in range(256)] for l in range(3) ]
# 平行移動 +a
# スライダー置いてコネクト、0-300、150に設定
def parallel( self , a ):
a = a-150
if a > 0 :
self.LUT[0] = [i+a if i+a <256 else 255 for i in range(256) ]
self.LUT[0][0]=0
else :
self.LUT[1] = [i+a if i+a >0 else 0 for i in range(256) ]
```
----
# ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね
- Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・
- 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?
----
→ [目次に戻る PyQt で画像のビューア](https://mimemo.io/m/QORbW4qkvOoda0N)
ホワイトポイント補正の延長
今は白に補正しているが、任意の色に補正したい(肌色を保存しておきたい)
HSV全て調節できるようにしたい
- 任意のポイントを特定色に変える
人間の頬のいろを合わせるとか - ヒストグラムの頂上を合わせるルーチンがあったのでそれ変形は?
カラーを二つ渡したら色毎に変換テーブルを作って、画像を変換してself.enhanced にセットして描画する
ルーチンを作る
def convertcolor(self,c1,c2) : # arg-->QColor
c1=[c1.red(),c1.green(),c1.blue()]
c2=[c2.red(),c2.green(),c2.blue()]
c1=[120,180,50] # original color
c2=[150,50,200] # target color
v=[ [ c2[i] /c1[i] , (255-c2[i]) / (255-c1[i]) , 255*(1-((255-c2[i]) / (255-c1[i]))) ] for i in range(3)]
t=[ [round(i*v[l][1]) if i < c1[l] else round(i*v[l][1]+v[l][2]) for i in range(256)] for l in range(3) ]
- これで変換テーブルは出来たから後は描画するだけのはず
- しかし、色変換は色相は維持されない、ピンポイント近くの色はうまく変換されるが他の色はおかしくなるような??
白変換だからうまくいくのではないだろうか?
ヒストグラムの単純な平行移動ルーチンを作りたい
# 初期化
self.LUT = [ [i for i in range(256)] for l in range(3) ]
# 平行移動 +a
# スライダー置いてコネクト、0-300、150に設定
def parallel( self , a ):
a = a-150
if a > 0 :
self.LUT[0] = [i+a if i+a <256 else 255 for i in range(256) ]
self.LUT[0][0]=0
else :
self.LUT[1] = [i+a if i+a >0 else 0 for i in range(256) ]
ベジェ曲線の座標の求め方について
- Qtはベジェ曲線を描画しているのだから座標も持ってるはずだと思いドキュメントを見てみたらこんなメッソドがあった
QPointF QPainterPath.pointAtPercent (self, float t)
このtは0-1で指定することになっていて、ベジェそのものですね - Qtもあくまでtベースでしか値は返してくれないって事だな
内部的にはどういう実装なんだろう?
曲線とは言ってもPCだから全てはドットの描画でしかないはずだ
でもドットだとx値が飛ぶところでは間が空くはずだ
でもパスだからどんなに拡大しても綺麗に描画出来るように実装されてるはずだ
やはり全てのx値を計算して求めてるんだろうか?
だとしたらそういう関数を用意してくれても良いと思うんだが・・・ - 今は自分でx,yを求めてるが、Qtの関数を使ってみるか???
結果が同じかどうかを調べてみるとか・・・
意味ないかな?