- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我制作了一个非常简单的程序,它读取图像、计算 sobel 滤波器,然后用 imshow 显示它。
import cv2
img = cv2.imread("/home/alex/imagens/train_5.jpg")
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) # x
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
norm = cv2.magnitude(sobelx, sobely)
normUint8 = norm.astype('uint8')
cv2.imshow("img", img)
cv2.imshow("norm", norm)
cv2.imshow("normUint8", normUint8)
print "img=" + str(img.dtype) + ", sobel=" + str(norm.dtype) + ", normUint8=" + str(normUint8.dtype)
cv2.waitKey(0)
cv2.destroyAllWindows()
我预计显示 norm 和 normUint8 的结果会相同或非常相似,因为它们的值在每个像素上的差异小于 1。因此,当我使用 CV_64FC3 图像时,我相信 opencv 在呈现它之前正在执行一些操作。
我有兴趣找到这个操作以便使用它。
有人可以帮忙吗?
这里附上我使用的原图。
谢谢。
最佳答案
您正在向 imshow
提供 64FC3
(3 channel ,64 位 float )图像.此功能的文档说明:
The function may scale the image, depending on its depth:
- If the image is 8-bit unsigned, it is displayed as is.
- If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].
- If the image is 32-bit floating-point, the pixel values are multiplied by 255. That is, the value range [0,1] is mapped to [0,255].
即使未提及 64 位 float ,我们也可以合理假设它们的处理方式与 32 位 float 相同。如果我们查看源代码,我们会发现转换是由函数 cvConvertImage
完成的。 .具体来说,关于 line 622
double scale = src_depth <= CV_8S ? 1 : src_depth <= CV_32S ? 1./256 : 255;
为那些不熟悉枚举类型顺序的人解释一下,它是 8U、8S、16U、16S、32S、32F、64F。因此,字节没有缩放,其他整数除法,其余( float )乘法。
由于显示我们需要一个 8 位图像,重要的是要注意缩放将以饱和度完成(在这种情况下,任何超过 255 的都变成 255,任何低于 0 的都变成 0)。
现在已经清楚 imshow
做了什么样的转换,让我们来看看为什么您会在一片白色的海洋中看到这些色 block 。
由于将 norm
简单转换为 uint8
得到的图像不是全黑的,我们可以安全地假设 norm
的值不在[0.0-1.0]
范围内。当值按 255 缩放时,任何大于或等于 1.0 的值都将变为 255(白色)。由于是 3 channel 图像,我们最终可能会发现只有部分 channel 不饱和的地方,因此我们会看到各种色 block 。
我们可以通过以下脚本来模拟这种行为:
b,g,r = cv2.split(norm)
r = np.uint8(np.where(r < 1.0, 0, 255))
g = np.uint8(np.where(g < 1.0, 0, 255))
b = np.uint8(np.where(b < 1.0, 0, 255))
cv2.imwrite('sobel_out.png', cv2.merge([b,g,r]))
我们将值 < 1.0 的像素设置为黑色,其他一切都变为白色。当我们组合平面时,我们得到以下图像:
看起来很眼熟?
注意:我怀疑方形图案来自您用于输入的 JPEG 压缩。
关于python - imshow 对此图像执行什么颜色转换(或其他操作),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44787104/
我有如下的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')
我是一名优秀的程序员,十分优秀!