-1

我正在尝试使用 c++ 程序进行灰度对比度拉伸,所以我遵循的来源是here。到目前为止,我有一个代码:

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

using namespace cv;
using namespace std;

int computeStretched(int x, int l1, int l2, int r1, int r2);

int main() {
  Mat img = imread("pict6.jpg"); // Mat type initialization of an original image
  Mat grayScaleImg(img.size(), CV_8UC1);; // Gray scale mat initialization
  cvtColor(img, grayScaleImg, COLOR_BGR2GRAY); // conversion of image input to grayscaled view

  for (int i = 0; i < img.rows; i++) {
        for (int j = 0; j < img.cols; j++) {
            for (int k = 0; k < 3; k++) {
              int output = computeStretched(grayScaleImg.at<Vec3b>(i, j)[k], 70, 0, 200, 255);
              stretch_result.at<Vec3b>(i, j) = saturate_cast<uchar>(output);
            }
        }
  } 

waitKey(0);
return 0;
}

int computeStretched(int x, int l1, int l2, int r1, int r2) {
    float calcVal;

    if (0 <= x && x <= l1) {
       calcVal = (l2 / l1) * x;
    }else if (l1 < x && x <= r1) {
       calcVal = ((r2 - l2) / (r1 - l1)) * (x - l1) + l2;
    }else if (r1 < x && x <= 255) {
       calcVal  = ((255 - r2)/(255 - r1)) * (x - r1) + r2;
    }

    return (int)calcVal;
}

然而,我处理的图像不是 RGB 转换的,而是灰度图像。我也想使用简单的灰度图片执行与示例代码中相同的操作。必须在上面的列表中进行哪些更改才能启用它?

4

1 回答 1

0

您有灰度图像,这意味着 1 个通道。

所以相应地修改你的代码:

for (int i = 0; i < img.rows; i++) {
    for (int j = 0; j < img.cols; j++) {

          int output = computeStretched(grayScaleImg.at<uchar>(i, j), 70, 0, 200, 255);
          stretch_result.at<uchar>(i, j) = saturate_cast<uchar>(output);

    }

}

初始化“stretch_result

于 2019-11-28T05:20:36.810 回答