Matlab GUI-Gamma选择工具
Posted AomanHao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Matlab GUI-Gamma选择工具相关的知识,希望对你有一定的参考价值。
1、Gamma选择工具
初衷是想做一个gui界面,完成以下需求:
1、Gamma映射曲线的直观展示
2、Gamma映射曲线的手动调整
3、Gamma映射曲线的曲线保存
4、Gamma映射曲线的效果展示
再次借鉴了开源代码,做了一点微小的调整工作,源码路径如下:
https://github.com/oraclBH/Matlab-GUI-image-curve-adjustment
2、界面版本
基于开源代码,完成GUI修改,工具界面如下:
后续有时间,添加S型曲线、异形曲线的选项,Gamma曲线的曲线值保存。
3、测试程序
测试程序连接如下:
觉得本文对您有一点帮助,欢迎讨论、点赞、收藏,您的支持激励我多多创作。
我的个人博客主页,欢迎访问
我的CSDN主页,欢迎访问
我的GitHub主页,欢迎访问
我的知乎主页,欢迎访问
Python 交互式选择工具,例如 MATLAB
【中文标题】Python 交互式选择工具,例如 MATLAB【英文标题】:Python interactive selection tools like in MATLAB 【发布时间】:2013-02-25 00:56:49 【问题描述】:我正在尝试从 MATLAB 切换到 python,但现在我遇到了一些我自己无法解决的问题。我在用 Qt 设计器设计的 pyqt 中做了一个 GUI(分析一些神经元),所有可视化都是在 Qt 的 matplotlib 小部件中完成的(它包含在 pythonxy 中)但现在我需要一些工具,比如 MATLAB 中的交互式选择(不仅在图像但也在绘图上)与集成在 Qt GUI 中的 matplotlib 一起使用:
imline 垄断 椭圆形 无拘无束 imrect(在 pyqt GUI imrect for python 中不起作用); ginput(在 matplotlib 库的 matplotlib\blocking_input.py 文件中注释了命令 self.fig.show() 后,我可以直接在 myMatplotlibWidget.figure.ginput() 上调用 ginput)。我找到了这个http://matplotlib.org/users/event_handling.html拜托,不要告诉我必须用这个python模块xD自己实现上面的工具
我发现了这个http://www.pyqtgraph.org/,但它没有与 matplotlib 集成,并且最终的渲染不像在 matplotlib 中那么好。
pyqt有没有好的交互式选择工具?在 Google 上,我找不到任何有用的东西,但我不敢相信没有很好的 python 交互式工具......如果是这样,我将切换回 MATLAB。
感谢您的帮助
【问题讨论】:
鉴于您正在使用 Qt 来制作您的 gui,请使用 Qt 的工具来构建您需要的东西。 (例如QRubberBand
等)。 matplotlib 有类似的东西,但如果你将它嵌入到 Qt 中,那么使用 gui 中性的 matplotlib 小部件是没有意义的。
我是 Qt 和 python 的新手,我在 Qt 中使用 matplotlib 小部件只是因为它非常接近 MATLAB 绘图、直方图、词干、imshow 工具。无论如何,我会尝试自己编写我在 pyqt 中需要的交互工具 :) QRubberBand 类在我看来是一个很好的起点;对于 Qt 类来实现一些交互工具(主要是画线、矩形、多边形等),您还有其他建议吗?
【参考方案1】:
好的,我已经为集成在Qt GUI中的matplotlib实现了imline ...现在,imrect等很容易实现。如果有人需要 imrect 等,我会更新代码。下面是我的 imline 代码:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import scipy.optimize as opt
class Imline(QObject):
'''
Plot interactive line
'''
def __init__(self, plt, image = None, scale = 1, *args, **kwargs):
'''
Initialize imline
'''
super(Imline, self).__init__(None)
# set plot
self.__plt = plt
self.scale = scale
# initialize start and end points
self.startX = None
self.startY = None
self.endX = None
self.endY = None
# initialize line2d
self.__line2d = None
self.mask = None
# store information to generate mask
if(image is not None):
height, width = image.shape
else:
height = None
width = None
self.__width = width
self.__height = height
# set signals and slots
self.__c1 = self.__plt.figure.canvas.mpl_connect('button_press_event', self.__mousePressEvent)
self.__c2 = self.__plt.figure.canvas.mpl_connect('motion_notify_event', self.__mouseMoveEvent)
self.__c3 = self.__plt.figure.canvas.mpl_connect('button_release_event', self.__mouseReleaseEvent)
self.imlineEventFinished = SIGNAL('imlineEventFinished')
def __mousePressEvent(self, event):
'''
Starting point
'''
# get xy data
xdata = event.xdata
ydata = event.ydata
# check if mouse is outside the figure
if((xdata is None) | (ydata is None) | (self.startX is not None) | (self.startY is not None) | (self.endX is not None) | (self.endY is not None)):
return
# start point
self.startX = xdata
self.startY = ydata
def __mouseMoveEvent(self, event):
'''
Draw interactive line
'''
# get xy data
xdata = event.xdata
ydata = event.ydata
# check if mouse is outside the figure
if((xdata is None) | (ydata is None) | (self.startX is None) | (self.startY is None) | (self.endX is not None) | (self.endY is not None)):
return
# remove line
if(self.__line2d is not None):
self.__line2d[0].remove()
# set x, t
x = [self.startX, xdata]
y = [self.startY, ydata]
# plot line
self.__plt.axes.hold(True)
xlim = self.__plt.axes.get_xlim()
ylim = self.__plt.axes.get_ylim()
self.__line2d = self.__plt.axes.plot(x, y, color = [1, 0, 0])
self.__plt.axes.set_xlim(xlim)
self.__plt.axes.set_ylim(ylim)
# update plot
self.__plt.draw()
self.__plt.show()
def __mouseReleaseEvent(self, event):
'''
End point
'''
# get xy data
xdata = event.xdata
ydata = event.ydata
# check if mouse is outside the figure
if((xdata is None) | (ydata is None) | (self.endX is not None) | (self.endY is not None)):
return
# remove line
if(self.__line2d is not None):
self.__line2d[0].remove()
self.endX = xdata
self.endY = ydata
P = np.polyfit([self.startX, self.endX], [self.startY, self.endY],1 )
self.__m = P[0]
self.__q = P[1]
# update plot
self.__plt.draw()
self.__plt.show()
# disconnect the vents
self.__plt.figure.canvas.mpl_disconnect(self.__c1)
self.__plt.figure.canvas.mpl_disconnect(self.__c2)
self.__plt.figure.canvas.mpl_disconnect(self.__c3)
# emit SIGNAL
self.emit(SIGNAL('imlineEventFinished'))
def createMask(self):
'''
Create mask from painted line
'''
# check height width
if((self.__height is None) | (self.__width is None)):
return None
# initialize mask
mask = np.zeros((self.__height, self.__width))
# get m q
m = self.__m
q = self.__q
print m, q
# get points
startX = np.int(self.startX)
startY = np.int(self.startY)
endX = np.int(self.endX)
endY = np.int(self.endY)
# ensure startX < endX
tempStartX = startX
if(startX > endX):
startX = endX
endX = tempStartX
# ensure startY < endY
tempStartY = startY
if(startY > endY):
startY = endY
endY = tempStartY
# save points
self.startX = startX
self.endX = endX
self.startY = startY
self.endY = endY
# intialize data
xData = np.arange(startX, endX)
yData = np.arange(startY, endY)
# scan on x
for x in xData:
row = round(m*x + q)
if(row < startY):
row = startY
if(row > endY):
row = endY
mask[row, x] = 1
# scan on y
for y in yData:
col = round((y - q) / m)
if(col < startX):
col = startX
if(col > endX):
col = endX
mask[y, col] = 1
# get boolean mask
mask = mask == 1
# return boolean mask
return mask
【讨论】:
我认为这是 Internet 上用于在 Python 中实现类似 imline 的行为的最佳来源。您能否详细说明如何使用它(提供 MWE)?【参考方案2】:对于交互式工具,您可能需要查看 ipython notebook 或其他 ipython 应用程序。
ipython qt 控制台:
http://ipython.org/ipython-doc/dev/interactive/qtconsole.html
ipython 笔记本:
http://ipython.org/notebook.html
【讨论】:
【参考方案3】:matplotlib docs 有一个在 PyQt5 中工作的简单实现(为方便起见,从那里复制整个示例)
from matplotlib import pyplot as plt
class LineBuilder:
def __init__(self, line):
self.line = line
self.xs = list(line.get_xdata())
self.ys = list(line.get_ydata())
self.cid = line.figure.canvas.mpl_connect('button_press_event', self)
def __call__(self, event):
print('click', event)
if event.inaxes!=self.line.axes: return
self.xs.append(event.xdata)
self.ys.append(event.ydata)
self.line.set_data(self.xs, self.ys)
self.line.figure.canvas.draw()
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click to build line segments')
line, = ax.plot([0], [0]) # empty line
linebuilder = LineBuilder(line)
plt.show()
【讨论】:
以上是关于Matlab GUI-Gamma选择工具的主要内容,如果未能解决你的问题,请参考以下文章
TSP基于matlab改进的人工鱼群算法求解旅行商问题含Matlab源码 1479期
MATLAB教程案例51~67总结MATLAB人工智能类算法仿真经验和技巧总结