问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

如何用MATLAB实现“截屏取色”功能

创作时间:
作者:
@小白创作中心

如何用MATLAB实现“截屏取色”功能

引用
CSDN
1.
https://blog.csdn.net/TGF_0425/article/details/143813614

本文将介绍如何使用MATLAB实现一个简单的“截屏取色”功能。这个功能可以让你截取电脑屏幕的图像,并通过鼠标点击获取指定像素点的颜色值。适合有一定MATLAB基础的读者学习。

基本功能

运行函数后,截取电脑整个屏幕并显示在MATLAB图窗上;用鼠标进行取点,按Enter按键完成取点,按ESC按键取消操作;取点完成后以n×3的矩阵返回上述点的RGB值

代码实现

function CM = screenCapColor()
    %% 截屏
    % 创建Robot对象
    robot = java.awt.Robot();
    
    % 获取屏幕尺寸
    rect = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
    
    % 截取屏幕
    img = robot.createScreenCapture(java.awt.Rectangle(rect));
    w = img.getWidth(); %获取图像宽度
    h = img.getHeight(); %获取图像高度
    raster = img.getData(); %获取图像RGB数据,返回Raster类的对象
    
    % 转换成MATLAB图像数组
    I = zeros(w*h*3,1); %创建存储RGB像素信息的double数组
    I = raster.getPixels(0,0,w,h,I); %获取图像一维RGB颜色数组
    I = uint8(I); %转换成uint8数据类型
    I1 = I(1:3:length(I)); %提取R色一维数组
    I1 = reshape(I1,w,h); %转换为R色二维数组
    I2 = I(2:3:length(I)); %提取G色一维数组
    I2 = reshape(I2,w,h); %转换为G色二维数组
    I3 = I(3:3:length(I)); %提取B色一维数组
    I3 = reshape(I3,w,h); %转换为B色二维数组
    I = uint8(zeros(w,h,3)); %创建存储RGB图像信息三维矩阵
    I(1:w,1:h,1) = I1; %导入R色数组
    I(1:w,1:h,2) = I2; %导入G色数组
    I(1:w,1:h,3) = I3; %导入B色数组
    I = imrotate(I,-90,'nearest'); %图像顺时针旋转90度
    I = flip(I,2); %图像竖直镜像
    
    % 显示图像
    f1 = figure;
    imshow(I);
    
    %% 颜色提取并返回
    [x,y] = ginput();
    Num = length(x);
    f = figure;
    f.Position = [700,593,512,162];
    CM = zeros(Num,3);
    for i = 1:Num
        % 显示点击处周围10*10的矩形区域
        cropImg1 = imcrop(I,[x(i)-5 y(i)-5 10 10]);
        subplot(1,Num,i)
        imshow(cropImg1);
        % 保留点击点颜色值
        CM(i,:) = impixel(I,x(i),y(i));
    end
    close(f1)
end  

运行结果

问题与进阶

上述方法通过MATLAB自带的ginput函数进行取点,但该函数执行过程中无法进行其它任何操作,比如图片的缩放和平移,这使得图片中的微小部分难以选中,准确获取颜色。

如果需要实现更高级的功能,比如在取点过程中实现图片的缩放和平移,可以参考作者的另一篇文章《如何用MATLAB实现“截屏取色”功能(进阶版)》。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号