Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Opencv_Image Processing - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,opencv,image-processing,C++,Opencv,Image Processing,我实现了自己的拉普拉斯过滤器,但它看起来不像Gimp中的拉普拉斯过滤器。怎么了 我的尝试 笨蛋 cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image){ int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0}; int-tmp=0; int计数器=0; cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_8U); 对于(int i=1

我实现了自己的拉普拉斯过滤器,但它看起来不像Gimp中的拉普拉斯过滤器。怎么了

我的尝试

笨蛋

cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image){
int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0};
int-tmp=0;
int计数器=0;
cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_8U);

对于(int i=1;i在进入循环之前,您必须更改图像“laplaceImage”的类型,@Cris Luengo评论道,无需除以9:

cv::Mat ImageManipulation::mylaplace_filter(cv::Mat image)
{
    int laplace_mask[9] = { 0, -1, 0, -1, 4, -1, 0, -1, 0 };
    int tmp = 0;
    int counter = 0;
    cv::Mat laplaceImage = cv::Mat::ones(image.rows - 2, image.cols - 2, CV_32F);

    for (int i = 1; i < image.rows - 1; i++)
    {
        for (int j = 1; j < image.cols - 1; j++)
        {

            for (int k = i - 1; k < i + 2; k++)
            {
                for (int l = j - 1; l < j + 2; l++)
                {
                    tmp += laplace_mask[counter] * static_cast<int>(image.at<uchar>(k, l));
                    counter++;
                }
            }
            std::cout << tmp << std::endl;
            laplaceImage.at<float>(i - 1, j - 1) = tmp;
            tmp = 0;
            counter = 0;
        }
    }
    return laplaceImage;
}
cv::Mat ImageManipulation::mylaplace_过滤器(cv::Mat image)
{
int-laplace_掩码[9]={0,-1,0,-1,4,-1,0,-1,0};
int-tmp=0;
int计数器=0;
cv::Mat laplaceImage=cv::Mat::ones(image.rows-2,image.cols-2,cv_32F);
对于(int i=1;i这是一段非常简单的代码,有助于理解基础知识

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>

using namespace cv;


int main(int argc, char** argv){

    Mat src_gray, dst;

    Mat src = imread("ball.jpg");
    int kernel = 3;
    Mat filter = (Mat_ <double>(3,3) << 1,1,1,1,-8,1,1,1,1); // Laplace Filter

    filter2D(src, dst, -1, filter);
    imshow("Simple Function", dst);
    imshow("Simple Source", src);

    waitKey(0);

    return 0;
}
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/highgui/highgui.hpp”
#包括
使用名称空间cv;
int main(int argc,字符**argv){
材料src_gray,dst;
Mat src=imread(“ball.jpg”);
int核=3;

Mat过滤器=(Mat_u3,3)我不知道Gimp在那里做什么,但对于拉普拉斯滤波器来说,这也不是一个正确的输出。负值很重要,你不能通过饱和到零来丢弃它们。你需要创建一个有符号的输出图像,并存储有符号的结果。此外,你的1/9标准化很奇怪。你从哪里得到的?标准化的原因是什么按9缩放?以前从未见过。对不起,我的错误我是从平均值过滤器中获取的,我以前实现过。无需缩放图像以进行显示。
int32
图像的值可能在[-255*8,255*8]范围内。您可以执行
laplaceImage/16+128
以正确显示它。或者在图像中查找实际的最小值和最大值。但这是一个显示问题,不应将其混入过滤图像的计算中。您需要添加
@Cris
以在重播我的评论时通知我,否则我只能看到您的评论(注:)
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>

using namespace cv;


int main(int argc, char** argv){

    Mat src_gray, dst;

    Mat src = imread("ball.jpg");
    int kernel = 3;
    Mat filter = (Mat_ <double>(3,3) << 1,1,1,1,-8,1,1,1,1); // Laplace Filter

    filter2D(src, dst, -1, filter);
    imshow("Simple Function", dst);
    imshow("Simple Source", src);

    waitKey(0);

    return 0;
}