如何将RAW图像文件格式读入OpenCV而不损失任何分辨率?

iaqfqrcu  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(183)

我正在尝试将尼康". NEF"文件导入OpenCV。". NEF"是尼康相机拍摄的图片的RAW文件格式的文件扩展名。当我在Mac上的预览中打开该文件时,我看到分辨率为6000 x 4000,图片非常清晰。然而,当我将其导入OpenCV时,我只看到120乘160(RGB通道为3乘)的数据点,这导致分辨率的很大损失。
我的理解是,NumPy数组中有120 x 160个像素,用于存储OpenCV的像素信息。我尝试使用-1作为IMREAD_UNCHANGED标志,但许多像素被遗漏,图像质量受到很大影响。
以下是我的代码,供您参考:

# first Jupyter block
img = cv2.imread('DSC_1051.NEF', -1)
img.shape

执行img.shape返回(120,160,3)。

# second Jupyter block
cv2.namedWindow("Resize", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Resize", 1000, 700)
  
# Displaying the image
cv2.imshow("Resize", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

问题总结:

  • 原始图像形状为(6000,4000)
  • 打开CV导入(120,160),导致分辨率大幅降低
  • 使用IMREAD_UNCHANGED标志不会导致OpenCV导入图像中的所有像素,从而导致执行cv2.imshow()时图像质量下降。

我的问题:我如何使用OpenCV导入所需的像素数?2是否有一个特定的函数可以使用?3是否缺少一个参数需要传递?

wwtsj6pe

wwtsj6pe1#

如果你想用python操作RAW图像而不损失分辨率,你需要检查一个专门的库,比如rawpy

import rawpy

with rawpy.imread('filename.NEF') as raw:
    raw_image = raw.raw_image

有关详细信息,可以查看rawpy documentation

    • 注:**
  • 要安装rawpy,需要Python〈= 3.7
  • 如果你能多解释一点,你需要对图像做些什么,我可以帮助你
    • 示例1:**how to save .NEF as .jpg
  • 选项A:* rawpy + Pillow(您还需要安装Pillow
import rawpy
from PIL import Image

with rawpy.imread('filename.NEF') as raw:
    rgb = raw.postprocess(use_camera_wb=True)
    Image.fromarray(rgb).save('image.jpg', quality=90, optimize=True)
  • 选项B:* rawpy + cv2
import rawpy
import cv2

with rawpy.imread('filename.NEF') as raw:
    rgb = raw.postprocess(use_camera_wb=True)
    bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)
    cv2.imwrite("image.jpg",bgr)
    • 质量比较**

我用这个19.2mb .NEF image测试了代码,得到了以下结果:
| 方法|. jpg输出大小|尺寸|
| - ------|- ------|- ------|
| 公益诉讼|9千字节|320x212|
| CV2|14千字节|320x212|
| * * 破烂**+ PIL|1.4mb|小行星4284 × 2844 |
| * * 劳皮**+ cv2|2.5mb|小行星4284 × 2844 |

    • 示例2:**show .NEF with cv2
import rawpy
import cv2

with rawpy.imread('filename.NEF') as raw:
    rgb = raw.postprocess(use_camera_wb=True)
    bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)

    cv2.imshow('image', bgr)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

相关问题