- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在绘制 PGM 图像: 这是 data我正在使用。
问题是一些显示的像素是错误的。例如:
谁能解释这些差异以及如何解决这些差异?
这是我的来源:
from pylab import *
import numpy
LABELS = range(13)
NUM_MODES = len(LABELS)
def read_ascii_pgm(fname):
"""
Very fragile PGM reader. It's OK since this is only for reading files
output by my own app.
"""
lines = open(fname).read().strip().split('\n')
assert lines[0] == 'P2'
width, height = map(int, lines[1].split(' '))
assert lines[2] == '13'
pgm = numpy.zeros((height, width), dtype=numpy.uint8)
for i in range(height):
cols = lines[3+i].split(' ')
for j in range(width):
pgm[i,j] = int(cols[j])
return pgm
def main():
import sys
assert len(sys.argv) > 1
fname = sys.argv[1]
pgm = read_ascii_pgm(fname)
# EDIT: HACK!
pgm[0,0] = 12
cmap = cm.get_cmap('spectral', NUM_MODES)
imshow(pgm, cmap=cmap, interpolation='nearest')
edit = True
if edit:
cb = colorbar()
else:
ticks = [ (i*11./NUM_MODES + 6./NUM_MODES) for i in range(NUM_MODES) ]
cb = colorbar(ticks=ticks)
cb.ax.set_yticklabels(map(str, LABELS))
savefig('imshow.png')
if __name__ == '__main__':
main()
编辑
我现在明白这里发生了什么。基本上,imshow
似乎是这样做的:
[ min(image), max(image) ]
我想要它做的是:
我可以通过将图像的动态范围强制设置为 13 来验证这一点(请参阅标记为 HACK
的行)。有更好的方法吗?
这是一张更新后的图片:
最佳答案
解决方法是设置im.set_clim(vmin, vmax)
。基本上图像中的值被转换以覆盖整个颜色范围。例如,如果 3
是数据中的最大值,它将被分配最大颜色值。
相反,您需要告诉它 max_nodes
是最高值(在您的情况下为 13),即使它没有出现在数据中,例如im.set_clim(0, 13)
。
我稍微更改了您的代码以使用具有不同 num_modes
值的其他数据文件:
import numpy
from pylab import *
def read_ascii_pgm(fname):
lines = open(fname).read().strip().split('\n')
assert lines[0] == 'P2'
width, height = map(int, lines[1].split(' '))
num_modes = int(lines[2])
pgm = numpy.zeros((height, width), dtype=numpy.uint8)
for i in range(height):
cols = lines[3+i].split(' ')
for j in range(width):
pgm[i,j] = int(cols[j])
return pgm, num_modes + 1
if __name__ == '__main__':
import sys
assert len(sys.argv) > 1
fname = sys.argv[1]
pgm, num_modes = read_ascii_pgm(fname)
labels = range(num_modes)
cmap = cm.get_cmap('spectral', num_modes)
im = imshow(pgm, cmap=cmap, interpolation='nearest')
im.set_clim(0, num_modes)
ticks = [(i + 0.5) for i in range(num_modes)]
cb = colorbar(ticks=ticks)
cb.ax.set_yticklabels(map(str, labels))
savefig('imshow_new.png')
一些更简单的测试数据来说明。请注意,num_modes
值为 10,但没有数据点达到该级别。这显示了值如何以 1:1 的比例索引到颜色图中:
P2
5 3
10
0 1 0 2 0
3 0 2 0 1
0 1 0 2 0
输出:
关于python - 因 imshow 中的一个错误而关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6127282/
我有如下的python代码。 def konvolusi(self, X, F): X_height = X.shape[0] X_width = X.shape[1] F_h
我目前正在开发一个需要我读取 DICOM 文件并正确显示它们的程序。从 DICOM 文件中提取像素数组后,我通过 matplotlib 和 cv2 中的 imshow 函数运行它。令我惊讶的是,它们都
我正在尝试将一些 MatLab 代码转换为 Python3,但遇到一行问题,MatLab 中的这一行是 imshow(sqrt(I),[0,100],'InitialMagnification','f
这个问题在这里已经有了答案: How to 'turn off' blurry effect of imshow() in matplotlib? (2 个答案) 关闭 5 年前。 当我在 pyth
有什么好方法可以在 mathplotlib 中将复数的二维数组绘制为图像吗? 将复数的幅度映射为“亮度”或“饱和度”并将相位映射为“色相”(无论如何,色相只不过是 RBG 颜色空间中的相位)是非常有意
这是我的代码,当我尝试使用imshow时图像为黑色 cv::Mat src(height, width, CV_16U); for (int i = 0; i (i) = input_
我正在尝试绘制/显示具有特定参数的图像,但它没有显示。只有轮廓。有谁知道我如何解析我的图像以显示参数和轮廓?提前致谢 imshow(image,'Border','tight','Initia
我有一个大小为 2000x200 的二维数组,它可以有 N 个不同的唯一值(大约 20-30 个)。我希望能够使用具有随机颜色(例如 Set3)的 colormap (非线性)来 imshow 这个数
我使用 for 循环读取 300 帧并累积它们。我在内部给出了一个 imshow 命令来连续打印帧,但是在 for 循环处理期间它们没有被打印,而是作为单个图像出现 这是我的代码: enter cod
我有一个视频截图,没什么特别的: VideoCapture cap("video.mp4"); Mat frame; while (true) { cap >> frame; //some othe
绘制两个(或更多)子图时,图中(所有四个边)内有大片空白区域,如下所示: 以下是我用来绘制它的代码。 from pylab import * from matplotlib import rc, rc
我使用 imshow 图轴上的标签作为不同测试的标签,因此我希望这些标签是真实的。但是我得到的是 float ,例如3.5 ,3.0。我该如何更改? 例子: import numpy as np fr
我有 6750x6450 像素的图像,并尝试使用 OpenCv 的 imshow() 函数显示它。当我显示一张图像时,它显示得很糟糕(一些有线输出),当我尝试显示两张图像时出现 seqfault。将这
好吧,我知道这个问题可能不是新问题,我已经看过几篇关于同一问题的帖子,但它并没有真正帮助。我是 opencv 的新手,我正在尝试使用 imread 加载图像(在与存储可执行文件的文件夹不同的文件夹中)
我刚刚开始使用 Open CV 库,我的第一个代码是一个简单的负变换函数。 #include #include using namespace cv; using namespace std; v
我正在尝试绘制一个图来指定引力红移作为距离的函数。但是,我在绘图时遇到问题。我想从 rs=1.0 开始绘制它,因为在 schwarzshild 半径内无法检测到任何物体,在我的例子中是 rs=1.0。
我有一个简单的代码可以在 Matlab 中显示图像。我使用 imread() 来读取它,并使用 imshow() 来显示它。下面的代码,结果显示不正确。希望有人能帮助我。 img = imread('
为什么图中的图像(由 imshow 绘制)在被另一个 imshow 更新时会改变其大小? 演示代码: img = rand(100,100); figure(1); hold on; imshow(i
这是一个有趣的问题。 >> img = imread('a.pgm') >> size(img) ans 192 168 >> imshow(img) % works fine 但是,我将相同的
我以前在C语言中使用OpenCV,但现在决定给MATLAB一个机会。我是 MATLAB 的新手,从一开始我就遇到了问题: 我读了图片: X=dicomread('medicalimage.dcm')
我是一名优秀的程序员,十分优秀!