2015-10-23 5 views
2

Я пытаюсь преобразовать изображение в оттенках серого в тип CV64F. Из документации OpenCv я понял, что изображение в градациях серого имеет тип CV_8U. Я также обнаружил, что imshow отображает разные типы по-разному, поэтому мне нужно разделить на 255 до преобразования. Но после преобразования изображения я получаю много насыщенных пикселей.OpenCV конвертировать CV_8U в CV_64F

Я использую этот файл, сохранить как JPG: http://www.ele.uri.edu/~hansenj/projects/ele585/lab2/cameraman.gif

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <iostream> 
#include <cstring> 
#include <cmath> 

int main() 
{ 
    Mat I, input_image; 
    string path = "C:/<your_path>/camera_man.jpg"; 
    input_image = imread(path.c_str(), 0); // Read the file as grayscale 

    imshow("Original", input_image); 

    // Convert image to CV_64F 
    input_image *= (double) 1/255; 
    input_image.convertTo(I, CV_64F); 
    imshow("Converted", I); 

} 

ответ

4

Когда вы сделаете это:

input_image *= (double) 1/255; // (1) 
input_image.convertTo(I, CV_64F); // (2) 

Вы разделив каждое значение в CV_8UC1 матрице 255 в (1), поэтому каждый пиксель будет:

new_value = static_cast<uchar>(old_value/255) 

так, чтобы new_value может иметь только значения 0 для 0 <= old_value < 255 и 1 для old_value = 255. Тогда преобразование применяется в (2) по укороченным значениям.

Итак, вам нужно либо сначала преобразовать в CV_64FC1, а затем разделить:

input_image.convertTo(I, CV_64F); 
I *= (double)1/255; 

или применять масштабирование непосредственно в процессе преобразования:

input_image.convertTo(I, CV_64F, 1.0/255.0);