博客
关于我
python中numpy数据创建OpenCV图像数据
阅读量:373 次
发布时间:2019-03-04

本文共 1637 字,大约阅读时间需要 5 分钟。

Python与OpenCV的数据类型之坑:图像显示异常的解决方案

在用Python的numpy和OpenCV处理图像数据时,数据类型的选择往往是一个容易被忽视但却影响极大的关键因素。很多时候,我们会发现图像在显示时出现各种奇怪的现象,但当我们将图像保存为常规格式(如.jpg或.png)时,却能正常显示。这看似矛盾的现象,其实是由数据类型不当带来的。

以下是一段典型的代码示例:

import numpy as np
import cv2
w = 800
h = 600
img = cv2.imread("./images/image82.jpg")
blank = np.zeros((800, 600, 3))
blank[0] = img[0]
blank[1] = img[1]
blank[2] = img[2]
cv2.imshow("window", blank)
cv2.waitKey(0)

问题描述

运行上述代码,你可能会发现以下现象:

  • 图像中会有诡异的“雪花”或“块状”图案。
  • 原图的部分细节被“遗失”或模糊不清。
  • 显示的图像与实际读取的图像有显著差异。
  • 为什么会出现这样的情况?其实,这是因为OpenCV的imread函数默认读取图像为8位的无符号整数类型(unsigned int)。而在numpy中,整数类型的默认大小是4字节(int32),这会导致数据在类型转换过程中出现问题。

    数据类型的重要性

    在numpy中,数组的数据类型会直接影响数据的存储和处理方式。OpenCV图像的数据类型通常是uint8(8位无符号整数),每个像素占用1字节的空间。如果使用默认的int32类型,会导致每个像素占用4字节,这样图像的实际数据量会增加至原来的4倍,导致图像信息被压缩或丢失。

    为了解决这个问题,我们需要确保在创建numpy数组时,数据类型与OpenCV图像的数据类型一致。具体来说,我们需要将numpy数组的类型设置为uint8

    解决方案

    将上述代码中的np.zeros函数的类型参数添加为dtype=np.uint8,即可解决问题:

    import numpy as np
    import cv2
    w = 800
    h = 600
    img = cv2.imread("./images/image82.jpg")
    blank = np.zeros((800, 600, 3), dtype=np.uint8)
    blank[0] = img[0]
    blank[1] = img[1]
    blank[2] = img[2]
    cv2.imshow("window", blank)
    cv2.waitKey(0)

    总结经验

    在处理OpenCV图像时,始终记住数据类型的选择至关重要。确保numpy数组的类型与OpenCV图像的数据类型一致(即uint8),可以避免许多显示异常的问题。

    如果你在直接处理图像数据时不需要显示图像,而是需要将其保存为文件(如.jpg或.png),那么不需要特别设置数据类型,直接使用默认的uint8类型即可。以下是一个保存图像的示例代码:

    import numpy as np
    import cv2
    w = 800
    h = 600
    img = cv2.imread("./images/image82.jpg")
    blank = np.zeros((800, 600, 3))
    blank[0] = img[0]
    blank[1] = img[1]
    blank[2] = img[2]
    cv2.imwrite("./images/result.jpg", blank)

    保存后的图片文件在文件系统中可以正常查看,且未经处理的数据类型不会对图像质量产生影响。这进一步证明了数据类型的选择对显示与保存的影响不同。

    希望这篇文章能帮助你更好地理解OpenCV与numpy在图像处理中的数据类型问题。如果你有更多疑问,欢迎在评论区留言!

    转载地址:http://jyzg.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现selection sort选择排序算法(附完整源码)
    查看>>
    Objective-C实现sha256算法(附完整源码)
    查看>>
    Objective-C实现shell sort希尔排序算法(附完整源码)
    查看>>
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现skew heap倾斜堆算法(附完整源码)
    查看>>
    Objective-C实现Skip List跳表算法(附完整源码)
    查看>>
    Objective-C实现slack message松弛消息算法(附完整源码)
    查看>>
    Objective-C实现slow sort慢排序算法(附完整源码)
    查看>>
    Objective-C实现tanh函数功能(附完整源码)
    查看>>
    Objective-C实现z-algorithm算法(附完整源码)
    查看>>
    Objective-C实现zellers congruence泽勒一致算法(附完整源码)
    查看>>
    Objective-C实现Zero One Knapsack零一背包计算算法(附完整源码)
    查看>>
    Objective-C实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)
    查看>>
    Objective-C实现一个通用的堆算法(附完整源码)
    查看>>
    Objective-C实现一分钟倒计时(附完整源码)
    查看>>
    Objective-C实现三次样条曲线(附完整源码)
    查看>>
    Objective-C实现上传文件到FTP服务器(附完整源码)
    查看>>
    Objective-C实现两数之和问题(附完整源码)
    查看>>
    Objective-C实现中文模糊查询(附完整源码)
    查看>>
    Objective-C实现串口通讯(附完整源码)
    查看>>