【问题标题】:Want to translate this Matlab code into OpenCV code想把这个 Matlab 代码翻译成 OpenCV 代码
【发布时间】:2019-09-11 16:55:12
【问题描述】:

我想用 OpenCV 将一些 Matlab 代码翻译成 C++ 代码。我需要使用哪些功能?

对于逐元素乘法,我不知道要使用哪个函数。 例如,

cv::Mat A; cv::Mat B; cv::Mat C;
C = A + B;
//or
cv::add(A, B, C);

这是 MATLAB 代码:

% G and b are constant 
% Rb, CRb and Rb_final are the images

Rb = G(CRb+b);
min3 = min(min(Rb)); % minimum in the Rb image
max3 = max(max(Rb)); % maximum in the Rb image

Rb_final = uint8(255*(Rb-min3)/(max3-min3)); % This function is to scale the image into 0 ~ 255 using maximum and minimum value in the image. And then convert the image into 8-bit unsigned image.

这是我尝试过的 OpenCV 代码:

Rb_final = uint8(255*(Rb-min3)/(max3-min3));

我通过以下代码找到最大值和最小值:

double max3, min3; 
minMaxLoc(Rb, &min3, &max3); 
Rb = Rb - min3; 
Rb = 255 * Rb; 
Rb = Rb / (max3 - min3); 

我发现所有 B、G、R 频道都是这样。但是效果不如cv::convertScaleAbs(Rb, R, 255, 0);

【问题讨论】:

  • cv::add()operator+() 是等价的,请参见 the documentationcv::multiply* 也是如此。另见here
  • 我通过以下代码找到最大值和最小值:double max3, min3; minMaxLoc(Rb, &min3, &max3); Rb = Rb - minb; Rb = 255 * Rb; Rb = Rb / (max3 - min3);对于所有 B、G、R 通道都是这样。但是结果不如"cv::convertScaleAbs(Rb, R, 255, 0);"
  • 对不起!我现在只是编辑问题。

标签: c++ matlab opencv image-processing


【解决方案1】:

您的 C++ 代码的一个问题是图像的类型为 uint8,这意味着许多操作会溢出(或饱和)。例如,将图像乘以 255 可以保证溢出。相反,请对操作进行排序,以免溢出:

double max3, min3;
minMaxLoc(Rb, &min3, &max3);
Rb = Rb - min3;
Rb = Rb * (255 / (max3 - min3));

或者,使用cv::convertScaleAbs:

cv::convertScaleAbs(Rb, Rb, 255 / (max3 - min3), -min3);

【讨论】:

    【解决方案2】:

    这样做:

    Rb.convertTo(Rb,CV_32F);
    Rb *= C;
    Rb += b;
    Rb *= G;
    
    double max3, min3;
    minMaxLoc(Rb, &min3, &max3);
    Rb = 255 * (Rb - min3)/(max3 - min3);
    
    Rb.convertTo(Rb,CV_8U);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      相关资源
      最近更新 更多