尝试均衡图像时出现分割错误
Segmentation error when trying to equalize an image
我一直在阅读有关 opencv 的资料并且一直在做一些练习,在这种情况下我想执行图像均衡,我已经实现了以下代码,但是当我执行它时出现以下错误:
"Segmentation fault (core dumped)"
所以我不知道该交什么。
我尝试使用的公式如下:
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 行的整个大小(列数乘以每个像素的通道数)。
我一直在阅读有关 opencv 的资料并且一直在做一些练习,在这种情况下我想执行图像均衡,我已经实现了以下代码,但是当我执行它时出现以下错误:
"Segmentation fault (core dumped)"
所以我不知道该交什么。
我尝试使用的公式如下:
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 行的整个大小(列数乘以每个像素的通道数)。