gpt4 book ai didi

image-processing - Caffe 支持 16 位图像吗?如果没有,如何实现支持?

转载 作者:行者123 更新时间:2023-11-30 08:35:00 26 4
gpt4 key购买 nike

背景信息:我需要加载一些 16 位灰度 PNG。

Caffe是否支持通过ImageDataLayer加载16位图像?

经过一番谷歌搜索后,答案似乎并非如此。ImageDataLayer依赖 this io routine

cv::Mat ReadImageToCVMat(const string& filename,
const int height, const int width, const bool is_color) {
cv::Mat cv_img;
int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat cv_img_origin = cv::imread(filename, cv_read_flag);
if (!cv_img_origin.data) {
LOG(ERROR) << "Could not open or find file " << filename;
return cv_img_origin;
}
if (height > 0 && width > 0) {
cv::resize(cv_img_origin, cv_img, cv::Size(width, height));
} else {
cv_img = cv_img_origin;
}
return cv_img;
}

它使用opencv的cv::imread函数。除非设置了适当的标志,否则此函数会将输入读取为 8 位

CV_LOAD_IMAGE_ANYDEPTH - If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.

仅添加适当的标志是行不通的,因为稍后在代码 [io.cpp] 中,它们会检查 8 位深度:

void CVMatToDatum(const cv::Mat& cv_img, Datum* datum) {
CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte";
... }

我可以删除支票,但恐怕它的存在是有原因的,并且可能会发生不可预测的结果。有人可以阐明这个问题吗?

最佳答案

您可以修补 ImageDataLayer 以读取 16 位图像,如下所示:

  1. 添加您提到的适当标志 (io.cpp):

之后

int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
CV_LOAD_IMAGE_GRAYSCALE);

添加

cv_read_flag |= CV_LOAD_IMAGE_ANYDEPTH;
  • 修改您提到的检查 (data_transformer.cpp):
  • 这个

    CHECK(cv_img.depth() == CV_8U) << "Image data type must be unsigned byte";

    变成了

    CHECK(cv_img.depth() == CV_8U || cv_img.depth() == CV_16U) << "Image data type must be uint8 or uint16";
    bool is16bit = cv_img.depth() == CV_16U;
  • 像这样修改 DataTransformer 读取 cv::Mat 的方式(下面的函数相同):
  • 添加uint16_t类型的指针:

    const uchar* ptr = cv_cropped_img.ptr<uchar>(h);

    像这样

    const uint16_t* ptr_16 = cv_cropped_img.ptr<uint16_t>(h);

    然后使用适当的指针读取:

    Dtype pixel = static_cast<Dtype>(ptr[img_index++]);

    变成了

    Dtype pixel;
    if(is16bit)
    pixel = static_cast<Dtype>(ptr_16[img_index++]);
    else
    pixel = static_cast<Dtype>(ptr[img_index++]);

    关于image-processing - Caffe 支持 16 位图像吗?如果没有,如何实现支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112192/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com