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

2019/07/05 16:14 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
PyQt で画像のビューアを作る 9
- リスト内包表記 使えるかな?
画像に変換を掛けるとき

```
        data = im.getdata()
        data2=[]
        width, height = im.size
        for l in range( width * height ):
            r,g,b = data[l]
            r = self.LUT[r][1]  
            g = self.LUT[g][1]  
            b = self.LUT[b][1]  
            data2.append((r,g,b))   #  <======== tupple!!!!!!
        im2.putdata(data2)


        data = im.getdata()
        data2=[( LUT(i[0]) , LUT(i[1]) , LUT(i[2]) )  for i in data ]
        im2.putdata(data2)
```



- Y軸反転の実験
・最初のポイントを右上がりになるように設定する
widgetの大きさによるが、
(0,0)-> (255,255) は、 
(0 ,270 )->( 255,15) になる、多分
・yのレンジ 0~255 は、270~15 に反転する
描画はこのままで良いが、画像用の変換テーブルは反転を戻す
各値を -(a-270) とすれば良い
> newList = [ -( i-270) for i in list]


- マウス操作改善
①フラグはキープレスで立てる
②端点の■は常時表示してマウスムーブは無視
③マウストラッキングもはずす
④右クリックで両端点の同時ドラッグとする
- ベジェカーブのリセット機能(シフトキーとか)
- ベジェの描画をやめてLUTの描画だけにしたらどうかな?少し軽くないか?
- マスクをかけれないので改善(わかりづらいので書き直した方が良いような気がする)
- LUT改善
第一段階
 重複のxはパスして欠落したLUTを作る(256はないことになる)
第二段階
 x値をインデクスとしたy値だけのリストをLUTを元に新たに作る
 その際に欠落したxは前後のインデクスの平均で補完して、完全に256個のリストにする
 欠落が複数連続していても一律で平均値補間とする(傾斜はつけない)
欠落した数が多いほど信頼性は低いが、前後のy値が同じなら問題ない
前後のY値の幅が大きいときは誤差が大きいことになる
でも平均値で補完しておけばほぼ誤差はないと思う

```
temp=[]
self.LUT=[] # これをグローバルにしよう

        #  first step -----------------
        for l in range(256):
            t=l*tt
            x = (1-t)**3*p1[0] + 3*(1-t)**2*t*p2[0] + 3*(1-t)*t**2*p3[0] + t**3*p4[0]
            if round(x)==last_x:
                continue
            y = (1-t)**3*p1[1] + 3*(1-t)**2*t*p2[1] + 3*(1-t)*t**2*p3[1] + t**3*p4[1]
            last_x=round(x)
            temp.append([ last_x , round(y)])
        #  second step -----------------
        ii=0 # index of temp ( made by first step )
        self.LUT.clear()
        for i in range(256) :
            if l[ii][0] == i :
                self.LUT.append( temp[ii][1] ) # set y-value
                ii += 1
            else: 
                self.LUT.append( round((temp[ii][1] + temp[ii-1][1])/2) ) # set y-value
        print( len(self.LUT) , self.LUT )
```

---


- トーンカーブをチャンネルごとに適用する
①全て②rのみ③gのみ④bのみ⑤rg⑥rb⑦gb
以上7種類、ルーチンを7種類作った方が速いと思う
とりあえずは独立したラジオを三つ作って分岐させるのが簡単か?
- 画像種類毎に
RGB
CMYK
YCbCr (Y:輝度、Cb:青の色差、Cr:赤の色差)  これやってみたい
HSV

```
im = Image.open(sys.argv[1])
im = im.convert("YCbCr")
yy, cb, cr = im.split()
yy = ImageOps.equalize(yy);
im = Image.merge("YCbCr", (yy, cb, cr))
im = im.convert("RGB")
im.show()

```



- ヒストグラム表示してみる
https://qiita.com/pashango2/items/145d858eff3c505c100a
pillow
his=img.histgram()
print(his)
とりあえずコンソールでプリントしてみよう

- 各バンドを連続して返すため、RGBモードの場合は256 x 3=768個の要素を返します。
最初に最大値設定するか??
平均値を求めてその2倍まで表示、2倍以上の値は2倍に書き換える
最大値も求めておく必要?
h = mean(his) # 平均
m = max(his)  # 最大

```
his=img.histgram()
painter.setPen( Qt.red )
for i in range(255):
 painter.drawPoint( QPointf( i , his[i] ) 
painter.setPen( Qt.green )
for i in range(256,511) 
 painter.drawPoint( QPointf( i-256 , his[i] ) 
painter.setPen( Qt.blue )
for i in range(512,767) 
 painter.drawPoint( QPointf( i-512 , his[i] ) 

```

- ヒストグラム平坦化してみる
- ホワイトバランス出来ないかな??




- scipy 補間ここを読んでもう一回やってみよう
https://qiita.com/maskot1977/items/2a55c087974d0ac5e843








PyQtGraph
いつか試してみるか?
http://www.pyqtgraph.org/









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



      
  • リスト内包表記 使えるかな?
    画像に変換を掛けるとき
        data = im.getdata()
        data2=[]
        width, height = im.size
        for l in range( width * height ):
            r,g,b = data[l]
            r = self.LUT[r][1]  
            g = self.LUT[g][1]  
            b = self.LUT[b][1]  
            data2.append((r,g,b))   #  <======== tupple!!!!!!
        im2.putdata(data2)


        data = im.getdata()
        data2=[( LUT(i[0]) , LUT(i[1]) , LUT(i[2]) )  for i in data ]
        im2.putdata(data2)
  • Y軸反転の実験
    ・最初のポイントを右上がりになるように設定する
    widgetの大きさによるが、
    (0,0)-> (255,255) は、
    (0 ,270 )->( 255,15) になる、多分
    ・yのレンジ 0~255 は、270~15 に反転する
    描画はこのままで良いが、画像用の変換テーブルは反転を戻す
    各値を -(a-270) とすれば良い

newList = [ -( i-270) for i in list]

  • マウス操作改善
    ①フラグはキープレスで立てる
    ②端点の■は常時表示してマウスムーブは無視
    ③マウストラッキングもはずす
    ④右クリックで両端点の同時ドラッグとする
  • ベジェカーブのリセット機能(シフトキーとか)
  • ベジェの描画をやめてLUTの描画だけにしたらどうかな?少し軽くないか?
  • マスクをかけれないので改善(わかりづらいので書き直した方が良いような気がする)
  • LUT改善
    第一段階
     重複のxはパスして欠落したLUTを作る(256はないことになる)
    第二段階
     x値をインデクスとしたy値だけのリストをLUTを元に新たに作る
     その際に欠落したxは前後のインデクスの平均で補完して、完全に256個のリストにする
     欠落が複数連続していても一律で平均値補間とする(傾斜はつけない)
    欠落した数が多いほど信頼性は低いが、前後のy値が同じなら問題ない
    前後のY値の幅が大きいときは誤差が大きいことになる
    でも平均値で補完しておけばほぼ誤差はないと思う
temp=[]
self.LUT=[] # これをグローバルにしよう

        #  first step -----------------
        for l in range(256):
            t=l*tt
            x = (1-t)**3*p1[0] + 3*(1-t)**2*t*p2[0] + 3*(1-t)*t**2*p3[0] + t**3*p4[0]
            if round(x)==last_x:
                continue
            y = (1-t)**3*p1[1] + 3*(1-t)**2*t*p2[1] + 3*(1-t)*t**2*p3[1] + t**3*p4[1]
            last_x=round(x)
            temp.append([ last_x , round(y)])
        #  second step -----------------
        ii=0 # index of temp ( made by first step )
        self.LUT.clear()
        for i in range(256) :
            if l[ii][0] == i :
                self.LUT.append( temp[ii][1] ) # set y-value
                ii += 1
            else: 
                self.LUT.append( round((temp[ii][1] + temp[ii-1][1])/2) ) # set y-value
        print( len(self.LUT) , self.LUT )

  • トーンカーブをチャンネルごとに適用する
    ①全て②rのみ③gのみ④bのみ⑤rg⑥rb⑦gb
    以上7種類、ルーチンを7種類作った方が速いと思う
    とりあえずは独立したラジオを三つ作って分岐させるのが簡単か?
  • 画像種類毎に
    RGB
    CMYK
    YCbCr (Y:輝度、Cb:青の色差、Cr:赤の色差) これやってみたい
    HSV
im = Image.open(sys.argv[1])
im = im.convert("YCbCr")
yy, cb, cr = im.split()
yy = ImageOps.equalize(yy);
im = Image.merge("YCbCr", (yy, cb, cr))
im = im.convert("RGB")
im.show()

  • ヒストグラム表示してみる
    https://qiita.com/pashango2/items/145d858eff3c505c100a
    pillow
    his=img.histgram()
    print(his)
    とりあえずコンソールでプリントしてみよう

  • 各バンドを連続して返すため、RGBモードの場合は256 x 3=768個の要素を返します。
    最初に最大値設定するか??
    平均値を求めてその2倍まで表示、2倍以上の値は2倍に書き換える
    最大値も求めておく必要?
    h = mean(his) # 平均
    m = max(his) # 最大

his=img.histgram()
painter.setPen( Qt.red )
for i in range(255):
 painter.drawPoint( QPointf( i , his[i] ) 
painter.setPen( Qt.green )
for i in range(256,511) 
 painter.drawPoint( QPointf( i-256 , his[i] ) 
painter.setPen( Qt.blue )
for i in range(512,767) 
 painter.drawPoint( QPointf( i-512 , his[i] ) 

PyQtGraph
いつか試してみるか?
http://www.pyqtgraph.org/


→ 目次に戻る