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

2019/07/03 15:11 by yamasyuh68
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
トーンカーブ
```
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import QPointF ,QRectF ,Qt
from PyQt5.QtGui import QPainterPath ,QPainter ,QPen
from scipy import interpolate

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('hogetta')
        self.setGeometry( 500, 50 , 500 , 500 )
        # self.setMouseTracking (True)  # <----------------*****
        # self.list=[[0,255] , [125, 125 ] , [255,0] ]   #  curve points  0,2:fix  1:variable
        self.x=[0,125,255]  # to use scipy function
        self.y=[255,125,0]
        self.f_list=[]      # look up table ( curve )
        for l in range(256):
            self.f_list.append(QPointF( l , l))   # make initial table --> line
        self.a = QPointF(4,4) # Tolerance in detecting point
        self.pselected = -1             # selectedpoint
        self.pmove = 0                  # move flag
        self.show()

    def mouseMoveEvent(self ,e):
        if self.pmove :  # Dorag ing
            # self.list[1] = e.pos()    # 1 only now
            self.x[1] = e.pos().x()
            self.y[1] = e.pos().y()
            self.makedata()
            self.update()

    def mousePressEvent(self ,e):
        self.pmove = True
    def mouseReleaseEvent(self ,e):
        self.pmove = False

    def makedata(): # make function , make table
        func = interpolate.interp1d(x, y, kind="cubic") # <------------
        for l in range(256):
            self.f_list[l] = QPointF( l , func(l) )

    def paintEvent (self,e):

        painter= QPainter()
        painter.begin(self) 
        painter.setPen( QPen( Qt.black , 2, style=Qt.SolidLine ) )
        for l in range( 256 )
            painter.drawPoint( self.f_list[l] )
        painter.setPen( QPen( Qt.red , 8, style=Qt.SolidLine ) )
        painter.drawPoint( self.x[1] ,  self.y[1] )
        painter.end() 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
```

- 右上がりの直線を基本に、中間にポイントを追加していくことでなめらかなカーブを描く事が出来ます
このカーブの方程式をscipyモジュールで作り、0から255までの横軸x値に対しての縦軸Y値を求めてリスト化します
このリスト化された256個のポイントを一つづつ描画したものが表示されているカーブです
このリストが画像の補正に使う変換テーブルそのものってことになります

- 次に変換テーブルを元に画像のピクセル毎に明るさを変換していきます
あるピクセルの明るさが100だった場合、変換テーブルでx=100のポイントを探して、そのy値が新しい明るさということになります
画像の全てのピクセルに対して変換を実施することになります
- 画像の各ピクセルの操作はpillowでもopenCVでも何でも良いです
メモリ上の値を直接いじれればそれでも良いです
- この場合、RGBの三色全てに対して同じように変換するのか、Rに対してだけ変換するのか、はまた別の問題です
補正後の画質の優劣はここでも変わってくる、それはまた別の技術です
- OpenCVでのヒストグラム <-- ここら辺で勉強しよう
http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_histograms/py_table_of_contents_histograms/py_table_of_contents_histograms.html#table-of-content-histograms

      
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtCore import QPointF ,QRectF ,Qt
from PyQt5.QtGui import QPainterPath ,QPainter ,QPen
from scipy import interpolate

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.setWindowTitle('hogetta')
        self.setGeometry( 500, 50 , 500 , 500 )
        # self.setMouseTracking (True)  # <----------------*****
        # self.list=[[0,255] , [125, 125 ] , [255,0] ]   #  curve points  0,2:fix  1:variable
        self.x=[0,125,255]  # to use scipy function
        self.y=[255,125,0]
        self.f_list=[]      # look up table ( curve )
        for l in range(256):
            self.f_list.append(QPointF( l , l))   # make initial table --> line
        self.a = QPointF(4,4) # Tolerance in detecting point
        self.pselected = -1             # selectedpoint
        self.pmove = 0                  # move flag
        self.show()

    def mouseMoveEvent(self ,e):
        if self.pmove :  # Dorag ing
            # self.list[1] = e.pos()    # 1 only now
            self.x[1] = e.pos().x()
            self.y[1] = e.pos().y()
            self.makedata()
            self.update()

    def mousePressEvent(self ,e):
        self.pmove = True
    def mouseReleaseEvent(self ,e):
        self.pmove = False

    def makedata(): # make function , make table
        func = interpolate.interp1d(x, y, kind="cubic") # <------------
        for l in range(256):
            self.f_list[l] = QPointF( l , func(l) )

    def paintEvent (self,e):

        painter= QPainter()
        painter.begin(self) 
        painter.setPen( QPen( Qt.black , 2, style=Qt.SolidLine ) )
        for l in range( 256 )
            painter.drawPoint( self.f_list[l] )
        painter.setPen( QPen( Qt.red , 8, style=Qt.SolidLine ) )
        painter.drawPoint( self.x[1] ,  self.y[1] )
        painter.end() 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
  • 右上がりの直線を基本に、中間にポイントを追加していくことでなめらかなカーブを描く事が出来ます
    このカーブの方程式をscipyモジュールで作り、0から255までの横軸x値に対しての縦軸Y値を求めてリスト化します
    このリスト化された256個のポイントを一つづつ描画したものが表示されているカーブです
    このリストが画像の補正に使う変換テーブルそのものってことになります

  • 次に変換テーブルを元に画像のピクセル毎に明るさを変換していきます
    あるピクセルの明るさが100だった場合、変換テーブルでx=100のポイントを探して、そのy値が新しい明るさということになります
    画像の全てのピクセルに対して変換を実施することになります

  • 画像の各ピクセルの操作はpillowでもopenCVでも何でも良いです
    メモリ上の値を直接いじれればそれでも良いです

  • この場合、RGBの三色全てに対して同じように変換するのか、Rに対してだけ変換するのか、はまた別の問題です
    補正後の画質の優劣はここでも変わってくる、それはまた別の技術です

  • OpenCVでのヒストグラム <-- ここら辺で勉強しよう
    http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_histograms/py_table_of_contents_histograms/py_table_of_contents_histograms.html#table-of-content-histograms