为何渲染的色深会随直方图计算/绘制顺序而变化?(Octave环境)
为何渲染的色深会随直方图计算/绘制的顺序发生变化?
这个问题其实是Octave里imshow和imhist之间的上下文交互搞的鬼,我之前在Win7的Octave环境里也碰到过类似的情况!
问题根源
- 你用
imread读入的灰度图是uint8类型,本身是256级色深的,这点没问题。 - 但
imhist在绘制直方图时,会悄悄修改当前图形窗口的颜色轴范围(caxis):比如当你调用imhist(IMG, 8)时,它会把颜色轴范围调整为适配8个bin的区间,而这个设置会被同一窗口内后续的imshow继承。 - 如果把
imshow的顺序放在imhist(...,8)之后,imshow就会用这个被修改的颜色轴范围来映射图像灰度值,相当于把256级灰度压缩到8个区间显示,视觉上就呈现为色深降低了。
解决办法
这里有几个稳妥的方案,按需选择:
- 显式指定
imshow的显示范围:调用imshow时加上[0 255]参数,强制用全灰度级范围渲染,不受之前的上下文影响。示例:imshow(IMG, [0 255]); - 手动重置颜色轴:在每次调用
imshow前,执行caxis([0 255]),把颜色轴恢复到256级灰度的默认范围。 - 隔离子图上下文:给每个子图单独创建独立的轴对象,避免设置互相干扰,比如用
axes函数指定子图后再绘图。
调整后的示例代码
结合你的代码,修改后可以避免色深变化问题:
pkg load image % 加载image包 IMG = imread('A.png'); % 读取图像 % 先重置全局颜色轴,避免残留设置影响 caxis([0 255]) subplot(1,3,1); % 显示原始图像 imshow(IMG, [0 255]); % 明确指定全灰度范围 title('Original image'); subplot(1,3,2); % 显示256 bins直方图 imhist(IMG, 256); title('Histogram 256 bins'); subplot(1,3,3); % 显示8 bins直方图 imhist(IMG, 8); title('Histogram 8 bins');
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

