PyQt で画像のビューアを作る 8 version 3
:追加された部分
:削除された部分
(差分が大きい場合、文字単位では表示しません)
トーンカーブ
```
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