【问题标题】:Image Rotation gives grayscale image图像旋转给出灰度图像
【发布时间】:2019-06-14 16:19:36
【问题描述】:

我在 C++ 中使用 OpenCV 和 Qt 旋转图像函数时遇到问题。 它有点像他的工作,但没有像预期的那样,除了灰度之外,图像的一部分似乎在右上角重复。

之前

之后

void ImgProcessing::rotate(cv::Mat &img, cv::Mat &tmp, int angle){

    float rads = angle*3.1415926/180.0;
    float cs = cos(-rads);
    float ss = sin(-rads);

    float xcenter = (float)(img.cols)/2.0;
    float ycenter = (float)(img.rows)/2.0;

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

            int rorig = ycenter + ((float)(i)-ycenter)*cs - ((float)(j)-xcenter)*ss;
            int corig = xcenter + ((float)(i)-ycenter)*ss + ((float)(j)-xcenter)*cs;
            int pixel = 0;
            if (rorig >= 0 && rorig < img.rows && corig >= 0 && corig < img.cols) {
                     tmp.at<int>(i ,j) = img.at<int>(rorig, corig);
                  }else tmp.at<int>(i ,j) = 0;
        }

}

问题可能在于访问图像像素吗?

【问题讨论】:

  • 如果您使用的是 OpenCV,为什么不使用 OpenCV's builtin functionality 呢?效率会高很多。 img.at&lt;&gt; 函数效率不高。
  • 知道,但该项目将由我的教授审查,所以我自己实现所有线性和非线性转换,因为我们同意使用 opencv 来读取和保存图像矩阵.

标签: c++ image opencv image-processing


【解决方案1】:

这取决于您在图像中的阅读方式,但我认为您访问它的方式不正确。应该是这样的:

Vec3b intensity = image.at<Vec3b>(j, i);

【讨论】:

  • 我认为 Vec3b 是用来访问 BGR 通道值的。我正在使用 imread opencv 的函数读取图像 normale,然后将其转换为 RGB。
  • 刚刚试了一下,通过 Vec3b 访问它完全可以工作!!!非常感谢!!
  • 很高兴听到这个消息!作为解释:您使用 (i,j) 访问的每个位置都具有三个值 R、G、B。因此,如果您只使用一个 int,您最终只会得到其中一个值。
  • 事实上,对于像 Brightened 这样的其他转换,我通过 Vec3b 访问每个 rgb 通道的 (i, j) [k],我正在努力弄清楚如何访问整个向量保持所有通道,以制作有点几何失真的过滤器!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多