如何在不损失分辨率的情况下将 RAW 图像文件格式读入 OpenCV?

gan*_*kar 1 python opencv image image-processing rawimage

我正在尝试将 Nikon '.NEF' 文件导入 OpenCV。“.NEF”是尼康相机拍摄的照片的 RAW 文件格式的文件扩展名。当我在Mac上以预览方式打开该文件时,我看到分辨率为6000 x 4000,并且图片非常清晰。然而,当我将其导入 OpenCV 时,我只能看到 120 x 160(RGB 通道为 3)个数据点,这会导致分辨率的大幅损失。

我的理解是,NumPy 数组中有 120 x 160 个像素,存储有关 OpenCV 像素的信息。我尝试使用 -1 作为 IMREAD_UNCHANGED 标志,但许多像素被遗漏,图像质量受到很大影响。

供您参考,这是我的代码:

# first Jupyter block
img = cv2.imread('DSC_1051.NEF', -1)
img.shape
Run Code Online (Sandbox Code Playgroud)

执行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()
Run Code Online (Sandbox Code Playgroud)

问题摘要:

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

我的问题:如何使用 OpenCV 导入所需数量的像素?有我可以使用的特定功能吗?我是否缺少要通过的参数?

Ped*_*cha 5

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

\n
import rawpy\n\nwith rawpy.imread(\'filename.NEF\') as raw:\n    raw_image = raw.raw_image\n
Run Code Online (Sandbox Code Playgroud)\n

您可以查看rawpy文档以获取更多信息

\n

笔记:

\n
    \n
  • 安装rawpy需要Python<=3.7
  • \n
  • 如果您再解释一下您需要对图像做什么,我可以帮助您
  • \n
\n

示例1: how to save .NEF as .jpg

\n

选项A: rawpy + Pillow(你也需要安装Pillow

\n
import rawpy\nfrom PIL import Image\n\nwith rawpy.imread(\'filename.NEF\') as raw:\n    rgb = raw.postprocess(use_camera_wb=True)\n    Image.fromarray(rgb).save(\'image.jpg\', quality=90, optimize=True)\n
Run Code Online (Sandbox Code Playgroud)\n

选项B: rawpy + cv2

\n
import rawpy\nimport cv2\n\nwith rawpy.imread(\'filename.NEF\') as raw:\n    rgb = raw.postprocess(use_camera_wb=True)\n    bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)\n    cv2.imwrite("image.jpg",bgr)\n
Run Code Online (Sandbox Code Playgroud)\n

品质对比

\n

我使用这个19.2mb .NEF 图像测试代码,得到以下结果:

\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n
方法.jpg 输出尺寸方面
太平洋石油公司9kb320x212
CV214kb320x212
rawpy + PIL1.4MB第4284章 xe2x80x8axc3x97xe2x80x8a2844
原始码+ CV22.5MB第4284章 xe2x80x8axc3x97xe2x80x8a2844
\n
\n

示例2: show .NEF with cv2

\n
import rawpy\nimport cv2\n\nwith rawpy.imread(\'filename.NEF\') as raw:\n    rgb = raw.postprocess(use_camera_wb=True)\n    bgr = cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)\n\n    cv2.imshow(\'image\', bgr)\n    cv2.waitKey(0)\n    cv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n