Octave中displayData函数显示灰度矩阵图像为何输出全黑
针对Octave运行displayData输出全黑的解决步骤
- 先排除数据本身的异常
不用改课程自带的函数,先在Octave控制台跑几行测试代码,确认传入的X矩阵没问题、基础图像渲染链路没坏:
要是单独渲染单张图都全黑,那问题根本不在displayData函数,就是Octave本身的图形配置出问题了。load('ex3data1.mat'); % 打印X的全局最值,排除矩阵加载成全零的低级问题 disp(['X矩阵最大值:', num2str(max(X(:)))]); disp(['X矩阵最小值:', num2str(min(X(:)))]); % 单独渲染第一张样本图,测试基础渲染功能 figure; imagesc(reshape(X(1, :), 20, 20)); colormap(gray); axis off; - 补全apt安装版Octave的缺失依赖
PopOS用apt装的Octave默认是精简版,缺Linux下图形渲染需要的X11适配组件,这是Linux下Octave输出全黑最常见的原因。退出Octave后在终端跑安装命令补全依赖:
重新打开Octave后,先在控制台切换到兼容性更好的fltk图形后端,避开gnuplot后端的颜色映射bug:sudo apt update sudo apt install octave octave-image gnuplot-x11
之后再调用graphics_toolkit("fltk");displayData(X)测下输出。 - 适配旧版Octave的颜色轴bug
apt源带的Octave版本普遍偏老,imagesc传的显示范围和colormap映射经常对不上:原函数里整个显示数组的取值是-1(图块之间的padding填充值)到1(归一化后的手写数字像素值),但旧版Octave的gray colormap默认只映射0-1的区间,超出范围的所有值会被统一当成纯黑渲染。
不用大改课程给的代码,只要在原来的h = imagesc(display_array, [-1 1]);下面加一行显式设置颜色轴范围的代码就行:caxis([-1 1]); - 补充适配小问题
要是渲染出来是反色(本来是黑底白字的手写数字变成白底黑字),只要把函数里的colormap(gray);改成colormap(flipud(gray));就能校正灰度方向。
内容的提问来源于stack exchange,提问作者Daniel Oscar
相关产品推荐
相关产品推荐

