如何使用滑块改变图像的RGB值在GUI

21次观看(过去30天)
杨朱蒂
杨朱蒂 20月6日
评论: rik. 20月7日
我正在创建一个GUI,其中一个人可以单击一个按钮选择要加载到轴上的图像,然后使用4个滑块,我希望单独调整红色,绿色和蓝色值,还可以单独调整红色,绿色和蓝色值,还可以使用1个滑块调节所有这些都是立刻。滑动机还需要有一个显示它是数值(-1到1)的文本。最后,每个单独的滑块都应该考虑其他3个滑块的值,也可以考虑到其他3个滑块的值。,如果我移动红色滑块然后移动蓝色滑块,最终的图像shold会增加红色和蓝色,而不是蓝色。
目前,我有图像选择按钮工作,我能够在移动时显示每个滑块的值,但我无法弄清楚如何改变图像(然后保存它的副本)。这是我为红色滑块和我的按钮有什么:
% - 在滑块运动上执行。
函数RedBar_callback(fhref,eventdata,handles)
% hObject处理到RedBar(参见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%处理手柄和用户数据的结构(见Guidata)
%提示:get(fhref,'值')返回滑块的位置
%get(fhref,'min')并获得(fhref,'max')来确定滑块的范围
rvalue = bebult.value;
rvaluestr = num2str(右值);
SET(HANDLE.REDBORPOSTION,'细绳', rvaluestr);
Image(:,:,1) = Image(:,:,1) + 128*rvaluestr;
imshow(图像,“父”,手柄.Image);
句柄。形象= imread(图片);
guidata (hObject处理);
%——执行在按钮按下LoadButton。
函数loadbutton_callback(fhref,eventdata,handles)
%frefle handle加载button(见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%处理手柄和用户数据的结构(见Guidata)
[filename,path] = UigetFile('* .jpg''选择一个图像'
fullfilename = fullfile(路径,文件名)
image = imread(fullfilename);
集(handles.Image);
imshow(图像,“父”,手柄.Image);
句柄。形象=图像;
guidata (hObject处理);
3评论
杨朱蒂
杨朱蒂 20月7日
好吧,我解决了所有的问题,除了一个。我仍然不能得到的改变停留(我假设我应该存储修改的图像在某处如所说),但我不知道如何做。因此,我的每个滑块都改变了图像,但一旦使用另一个滑块,第一个的效果就消失了。以下是相关代码;每个滑块都是相同的,除了每个颜色的Image(:,:, 1)线的改变(例如,绿色有GreenBar &(:,:, 2)和蓝色有BlueBar &(:,:, 3)和亮度同时改变:
% - 在滑块运动上执行。
函数RedBar_callback(fhref,eventdata,handles)
% hObject处理到RedBar(参见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%处理手柄和用户数据的结构(见Guidata)
%提示:get(fhref,'值')返回滑块的位置
%get(fhref,'min')并获得(fhref,'max')来确定滑块的范围
%显示滑块值
值= hObject.Value;
valueR = num2str(价值);
SET(HANDLE.REDBORPOSTION,'细绳', valuestr);
%从滑块调整红色图像
值= hObject.Value;
形象= handles.PicData;
Image (:,:,1) = get(句柄。RedBar,'价值')* 128 +图像(::,1);
图像(图像,“父”,处理.Image)
设置(处理。形象,“可见”“关闭”);
Guidata(令人厌流,处理)

登录评论。

接受的答案

杨朱蒂
杨朱蒂 20月7日
好吧,我终于解决了我的问题。以下是为子孙后代着想的工作相关代码:
% - 在滑块运动上执行。
函数RedBar_callback(fhref,eventdata,handles)
% hObject处理到RedBar(参见GCBO)
%EventData保留 - 在未来版本的MATLAB中定义
%处理手柄和用户数据的结构(见Guidata)
%提示:get(fhref,'值')返回滑块的位置
%get(fhref,'min')并获得(fhref,'max')来确定滑块的范围
%显示滑块值
值= hObject.Value;
valueR = num2str(价值);
SET(HANDLE.REDBORPOSTION,'细绳', valuestr);
%从滑块上的图片中调整红色
图片= handles.picdata;
图片(:,:,1)=(get(handles.redbar,'价值')* 128 +图片(:,:,1))+(get(handles.kightnessbar,'价值')* 128 +图片(:,:,1));
get(handles.) = get(handles.)GreenBar,'价值') * 128 + Picture(:,:,2))+(get(handles.)BrightnessBar,'价值')* 128 +图片(::,:2));
图片(:,:,3)= (get(handles.))BlueBar,'价值')* 128 +图片(:,:,3))+(get(handles.kightnessbar,'价值') * 128 +图(:,:,3));
设置(处理。图片,“可见”“关闭”);
imshow(图片,“父”,处理。
1条评论
rik.
rik. 20月7日
imshow 是一个相对高级的函数。我建议换货 CData 物业。

登录评论。

更多答案(1)

Cris Lapierre.
Cris Lapierre. 20月7日
编辑:Cris Lapierre. 20月7日
是的,它与存储图像有关。回调是函数。一旦函数退出,变量就不存在了。您需要利用句柄结构来存储希望在其他回调函数中保存和使用的变量。看到 这个doc页面 关于如何使用它们的更多信息。
7评论
Cris Lapierre.
Cris Lapierre. 20月7日
根据您的描述,我理解在制作更改后用于显示图像的单独功能。代码我共享更新数据。您现在只需要更新显示。尝试RIK的代码。我们不知道您的组件标记名称,因此您可能必须调整它以使其工作。

登录评论。

标签

社区寻宝

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!