c++ - 输出为梯度计算中提供的单个图像并排生成 4 个图像

标签 c++ opencv image-processing

以下代码用于计算图像所有像素的归一化梯度。但是在计算出的梯度上使用 imshow 时,不是显示提供的图像的梯度,而是显示提供的图像的梯度 4 次(并排)。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/core/core.hpp>
#include<iostream>
#include<math.h>
using namespace cv;
using namespace std;
Mat mat2gray(const Mat& src)
{
    Mat dst;
    normalize(src, dst, 0.0, 1.0, NORM_MINMAX);
    return dst;
}
Mat setImage(Mat srcImage){

    //GaussianBlur(srcImage,srcImage,Size(3,3),0.5,0.5);
    Mat avgImage = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat gradient = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat norMagnitude = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    Mat orientation = Mat::zeros(srcImage.rows,srcImage.cols,CV_32F);
    //Mat_<uchar> srcImagetemp = srcImage;
    float dx,dy;
    for(int i=0;i<srcImage.rows-1;i++){
        for(int j=0;j<srcImage.cols-1;j++){
            dx=srcImage.at<float>(i,j+1)-srcImage.at<float>(i,j);
            dy=srcImage.at<float>(i+1,j)-srcImage.at<float>(i,j);
            gradient.at<float>(i,j)=sqrt(dx*dx+dy*dy);
            orientation.at<float>(i,j)=atan2(dy,dx);
            //cout<<gradient.at<float>(i,j)<<endl;
        }
    }

    GaussianBlur(gradient,avgImage,Size(7,7),3,3);
    for(int i=0;i<srcImage.rows;i++){
        for(int j=0;j<srcImage.cols;j++){
            norMagnitude.at<float>(i,j)=gradient.at<float>(i,j)/max(avgImage.at<float>(i,j),float(4));
            //cout<<norMagnitude.at<float>(i,j)<<endl;
        }
    }
imshow("b",(gradient));
waitKey();
return norMagnitude;    
}
int main(int argc,char **argv){
Mat image=imread(argv[1]);
cvtColor( image,image, CV_BGR2GRAY );
Mat newImage=setImage(image);
imshow("a",(newImage));
waitKey();

}

最佳答案

您传入的源图像的类型为 CV_8UC1,但您将其读取为 float :

dx=srcImage.at<float>(i,j+1)-srcImage.at<float>(i,j);
dy=srcImage.at<float>(i+1,j)-srcImage.at<float>(i,j);

如果在调试器下运行,这应该会抛出一个断言,这会突出问题。

尝试更改这些行以使用 unsigned char,如下所示:

dx=(float)(srcImage.at<unsigned char>(i,j+1)-srcImage.at<unsigned char>(i,j));
dy=(float)(srcImage.at<unsigned char>(i+1,j)-srcImage.at<unsigned char>(i,j));

关于c++ - 输出为梯度计算中提供的单个图像并排生成 4 个图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24279489/

相关文章:

c# - 如何获取 EmguCV ImageBox 图像?

image-processing - 在 opencv 中集成 cvblobslib

java - 计算机视觉应用程序的 GUI

c++ - 如何使用A.R Drone 2.0的PID Controller ?

c++ - 什么是更好地在数组中插入值,然后在保持排序顺序的同时进行排序或插入?

c++ - OpenGL 使用着色器定义颜色

C++ 逻辑 & 运算符

c++ - 如何在给定函数之外获取与 C 闭包关联的(向上)值?

c++ - OpenCV C++ Mat == 运算符

python - 如何在灰度图像上应用渐变贴图