Matlab 用不同的数值表示不同的颜色——可视化不同色块

function [x,y,z] = frequency_visualization(tick_x,tick_y,tick_z,x_n,y_n,V)
% 此程序是对立方体中存储轨迹数据的频数进行可视化



% meshgrid 生成三维网格
[x,y,z] = meshgrid(tick_x,tick_y,tick_z);

% % 三维体切片平面
% cube = slice(x,y,z,z,tick_x,tick_y,tick_z);

% 用cat函数读取一列
frequency = cat(1,V.points);

% 最大频数
max_frequency = max(frequency);

% 控制不同频数的小立方体的颜色变化
% 控制颜色变化的条应该是10份(几份除以几)
% unit = max_frequency/10;


% 调用str_split函数
all_digital = str_split(V);

%%%%%%%%%%%%%%%% 显示三维立方体部分代码

% 按z轴进行切片,因为z轴长度较短,容易切片
for i =1: length(tick_z)
    
    % 打开一个新窗口
    % figure;
    
    % 字符串匹配
    % temp_i = num2str(i);
    
    % 索引
    index = [];
    % 检查此切面中的小立方体的频数,返回存储这些频数的索引index
    for k = 1:length(all_digital)
        if all_digital(k) ==i
            index = [index k];
        else
            continue
        end
    end
    % 取出这个切面中存储点的所有小立方体和其频数
    segment = V(index);
    
    % 将有频数的小立方体上色,频数越大越黑
    % 创建矩阵
    map = zeros(x_n-1,y_n-1);
    
    for j = 1:length(segment)
         
        % 将频数值存入相应的矩阵中
        a = segment(j).shape;
        b = strsplit(a,'*');
        c = str2num(b{1,1});
        d = str2num(b{1,2});
        % 赋值
        map(c,d) = segment(j).points;
        
    end
    
    % 归一化数值
    nor_map = abs(log(map / max_frequency));
    nor_map(nor_map == inf) =0;
    [col,row] = size(nor_map);
    temp_map = reshape(nor_map,[1,col * row]);
    tmp_max = max(temp_map);
    nor_map = nor_map / tmp_max;
    
    
    nor_map = 1-nor_map;
    % 将用数字表示颜色深浅的归一化二维矩阵nor_map显示到三维空间
    %%%%%%%% 重要的显示部分
    % nor_map = 1-nor_map;
    
    %画出可视化数据
    % matrixplot(nor_map,'XVarNames',XVarNames,'YVarNames',YVarNames,'DisplayOpt','off');  
    matrixplot(nor_map,'DisplayOpt','off');
    colormap(gray(256))
    
%     % 进行横切面操作
%     xslice = [];
%     yslice = [];
%     zslice =tick_z(i) ;
%     v = x.*exp(-x.^2-y.^2-z.^2);
%     % 切割并显示
%     slice(x,y,z,v,xslice,yslice,zslice);
    
    % 等比设置
    axis equal
    
    % axis设置轴范围和纵横比,off为取消对坐标轴的一切设置,on为开启
    axis off


    % 需要修改
    % 需要进行字符串设定
    name =  sprintf('%d.png',i);
    
    % 按name的文件名保存当前窗口
    saveas(gcf,name);
    
    
end


% % 显示,设置图形对象属性,FaceColor是面的颜色,Marker顶点用什么表示
% % set(cube,'FaceColor','none','Marker','o','MarkerFaceColor','y')
% set(cube,'FaceColor','none','Marker','none')


% % view视点的指定
% view(3)


end



上面是可视化的代码,其中需要调用两个函数str_split(此函数传入的参数是一个结构体)和matrixplot(传入的参数是数据矩阵)

function matrixplot(data,varargin)
%   根据实值矩阵绘制色块图,用丰富的颜色和形状形象的展示矩阵元素值的大小。
%
%   matrixplot(data) 绘制矩阵色块图,data为实值矩阵,每一个元素对应一个色块,色
%                    块颜色由元素值大小决定。
%
%   matrixplot(data, 'PARAM1',val1, 'PARAM2',val2, ...) 
%          用成对出现的参数名/参数值控制色块的各项属性。可用的参数名/参数值如下:
%          'FigShape' --- 设定色块的形状,其参数值为:
%                'Square'  --- 方形(默认)
%                'Circle'  --- 圆形
%                'Ellipse' --- 椭圆形
%                'Hexagon' --- 六边形
%                'Dial'    --- 表盘形
%
%          'FigSize' --- 设定色块的大小,其参数值为:
%                'Full'    --- 最大色块(默认)
%                'Auto'    --- 根据矩阵元素值自动确定色块大小
%
%          'FigStyle' --- 设定矩阵图样式,其参数值为:
%                'Auto'    --- 矩形矩阵图(默认)
%                'Tril'    --- 下三角矩阵图
%                'Triu'    --- 上三角矩阵图
%
%          'FillStyle' --- 设定色块填充样式,其参数值为:
%                'Fill'    --- 填充色块内部(默认)
%                'NoFill'  --- 不填充色块内部
%
%          'DisplayOpt' --- 设定是否在色块中显示矩阵元素值,其参数值为:
%                'On'      --- 显示矩阵元素值(默认)
%                'Off'     --- 不显示矩阵元素值
%
%          'TextColor' --- 设定文字的颜色,其参数值为:
%                表示单色的字符('
### MATLAB中的图像块度识别 在MATLAB中实现图像块度识别通常涉及多个步骤,包括读取图像、预处理、分割以及特征提取等过程。下面将以一个具体的例子来展示如何利用MATLAB进行图像块度识别。 #### 图像读取与显示 首先需要加载待处理的图片文件到工作空间内并将其可视化: ```matlab % 读入彩色或灰度图像 img = imread('example.jpg'); imshow(img); title('原始图像'); ``` 对于某些特定的应用场景可能还需要进一步转换成灰阶表示形式方便后续操作[^1]。 #### 预处理阶段 为了提高最终效果的质量,在正式进入核心环节之前往往要先做些准备工作比如去除噪声或是调整对比度等等。这里可以考虑应用高斯模糊或者直方图均衡化技术改善视觉质量: ```matlab % 将RGB转为GrayScale如果必要的话 if size(img,3)==3 % 判断是否为三通道颜色图 img_gray=rgb2gray(img); else img_gray=img; end % 应用自适应直方图均衡化增强局部对比度 claheImg = adapthisteq(img_gray,'ClipLimit',0.02,'Distribution','rayleigh'); figure; subplot(1,2,1), imshow(img_gray), title('原灰度图像'); subplot(1,2,2), imshow(claheImg), title('CLAHE处理后'); ``` #### 实施分割策略 当完成了上述准备活动以后便能够着手于实际的任务——即确定目标对象的位置范围。一种常见做法就是依据像素强度分布特性设定合适的门限值从而区分前景背景两大部分;当然也存在着其他更为复杂的手段可供选用如区域增长法之类。 针对本案例而言推荐尝试Otsu's Method自动选取最佳切割界限: ```matlab level = graythresh(claheImg); bwImage = imbinarize(claheImg, level); figure; imshow(bwImage), title(['二值化图像 Level=' num2str(level)]); ``` #### 形态学运算优化轮廓结构 有时仅靠简单的黑白分离并不能获得理想的结果,因此有必要引入形态变换以修补缺陷之处。例如可以通过闭合操作填补内部孔洞,而开运算则有助于消除细小突起物[^2]: ```matlab se = strel('disk',5); closedBW = imclose(bwImage, se); openedBW = imopen(closedBW, se); figure; subplot(1,2,1), imshow(bwImage), title('初始二值化'); subplot(1,2,2), imshow(openedBW), title('形态学修正版'); ``` #### 提取连通域属性计算面积周长等参数 最后一步则是统计各个独立区块的信息量大小形状等方面的数据指标作为分类判断的重要依据之一。借助`regionprops()`函数很容易获取这些数值型描述符。 ```matlab stats = regionprops(openedBW,'Area','Perimeter','Eccentricity',... 'Orientation','MajorAxisLength','MinorAxisLength'); disp(stats); areas = cat(1, stats.Area); perimeters = cat(1, stats.Perimeter); figure; imshow(label2rgb(labelmatrix(bwlabel(openedBW)))); hold on; for k = 1:length(perimeters) boundary = bwboundaries((bwImage==k)); plot(boundary{1}(:,2),boundary{1}(:,1),'r','LineWidth',2); text(mean(boundary{1}(:,2)),mean(boundary{1}(:,1))... ,sprintf('%2.1f', areas(k)),'Color','y',... 'FontWeight','bold'); end title('标注各斑块面积') ``` 以上就是在MATLAB环境下执行图像块度识别的一般流程概述及其对应代码片段说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值