c++ - 尝试均衡图像时出现分割错误

标签 c++ image opencv equalizer

我一直在阅读有关 opencv 的资料,并且一直在做一些练习,在这种情况下,我想执行图像均衡,我已经实现了以下代码,但是当我执行它时,出现以下错误:

“段错误(核心已转储)”

所以我不知道该交什么。

我尝试使用的公式如下:

equalization

代码如下:

 #include <opencv2/opencv.hpp>
 #include <opencv2/highgui/highgui.hpp> 
 #include <stdio.h>

 using namespace cv;
 using namespace std;

 void equalization(cv::Mat &image,cv::Mat &green, int m) {
 Mat eqIm;
 int nl= image.rows; // number of lines

int nc= image.cols * image.channels();
for (int j=0; j<nl; j++) {

    uchar* data= image.ptr<uchar>(j);
    uchar* data2= green.ptr<uchar>(j);
    uchar* eqIm= green.ptr<uchar>(j);

    for (int i=0; i<nc; i++) {

        eqIm[i]= data[i]+m-data2[i];

    }
 }
 cv::imshow("Image",eqIm);
 imwrite("eqIm.png",eqIm);
 }

float mean(cv::Mat &image){
   cv:Scalar tempVal = mean( image );
   float myMAtMean = tempVal.val[0];
   cout << "The value is " << myMAtMean;
 }

 int main(int argc, char** argv ){
 Mat dst;
 Mat image= cv::imread("img.jpg");
 Mat green= cv::imread("green.jpg");

 cv::imshow("Image",image);
 float m= mean(image);

 equalization(image,green,m);
 cv::namedWindow("Image");
 cv::imshow("Image",image);
 imwrite("equalizated.png",dst);
 waitKey(0);
 return 0;

并且写入的图像“Equalization.png”不包含任何内容

最佳答案

您从未初始化过 Mat eqIm,所以当您执行 cv::imshow("Image", eqIm); imwrite("eqIm.png", eqIm); 垫子上什么都没有。 https://docs.opencv.org/2.4/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html

此外,我应该注意到您有 2 个 eqIm 变量。这可能是混淆的一部分。

最后一件事,在您的 mean 函数中,您最终可能会得到一个递归函数。您应该在您创建的均值函数中指定您正在使用的均值函数,即

float mean(cv::Mat &image) {
cv:Scalar tempVal = cv::mean(image);
    float myMAtMean = tempVal.val[0];
    cout << "The value is " << myMAtMean;
    return myMAtMean;
}

以下内容更接近您在均衡功能中寻找的内容。

void equalization(cv::Mat &image, cv::Mat &green, int m) {
    Mat eqIm(image.rows,image.cols,image.type());
    int nl = image.rows; // number of lines
    int nc = image.cols * image.channels();
    for (int j = 0; j<nl; j++) {// j is each row
        for (int ec = 0; ec < nc; ec++) {//ec is each col and channels
                eqIm.data[j*image.cols*image.channels() + ec] = image.data[j*image.cols*image.channels() + ec] + m - green.data[j*image.cols*image.channels() + ec];
        }
    }
    cv::imshow("Image", eqIm);
    imwrite("eqIm.png", eqIm);
}

我执行 j*image.cols*image.channels() 来遍历 j 行的整个大小(列数乘以每个像素的 channel 数)。

关于c++ - 尝试均衡图像时出现分割错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47382223/

相关文章:

c++ - 英特尔芯片组编程

c++ - C++ 标准要求提升为 int 吗?

javascript - 带有图像的 onClick()、onMouseOver() 和 onMouseOut()

java - 如何在 JSP 页面中检索并显示数据库中的图像?

python - OpenCV Python : Convert RGB to YCrCb

c++ - 为什么他们有系统字符串和标准字符串

c++ - static 在这里的目的是什么?

android - Android 4.4 中的新警告

python-3.x - 发生异常 : ModuleNotFoundError No module named 'cv2'

opencv - O'Reilly 书籍对 2D 线性系统的澄清