gpt4 book ai didi

c++ - 锐化图像 - 访问相邻像素

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:44 25 4
gpt4 key购买 nike

我正在编写以下代码:

#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

void Sharpen(Mat &,Mat);

int main()
{
Mat image,result;

try
{
image = imread("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");

if(!image.data)
{
throw 1;
}
}
catch(int i)
{
cout << "Image is unable to reae" << endl;
}

Sharpen(image,result);
waitKey(0);
}

void Sharpen(Mat &image,Mat result)
{
//result = image.clone();
result.create(image.size(), image.type());

//For all rows except first and last
for(int i=1;i<image.rows-1;i++)
{
const uchar *previous = image.ptr<const uchar>(i-1);
const uchar *next = image.ptr<const uchar>(i+1);
const uchar *current = image.ptr<const uchar>(i);

uchar *output = result.ptr<uchar>(i);

//For all columns except first and last
for(int a=1;a<image.cols-1;a++)
{
*output++ = cv::saturate_cast<uchar>(5*current[a]-current[a-1]-current[a+1]-previous[a]-next[a]);
}

}

result.row(0).setTo(cv::Scalar(0));
result.row(result.rows-1).setTo(cv::Scalar(0));
result.col(0).setTo(cv::Scalar(0));
result.col(result.cols-1).setTo(cv::Scalar(0));

namedWindow("Original");
imshow("Original",image);

namedWindow("Duplicate");
imshow("Duplicate",result);
}

在这里,我尝试做的是尝试锐化图像。以下是图像锐化的公式。

resultPixel = 5*currentPixel-previousPixel-nextPixel-upperPixel-belowPixel

无论如何,以下是我得到的输出

enter image description here

如您所见,我没有得到预期的结果。哪里做错了?

最佳答案

您的第一个问题是每个像素有 3 个字节,因此您只能迭代图像的三分之一。你的另一个问题是你不能做 *output++ 因为你想跳过第一个像素。将这两件事放在一起会产生以下代码,它会给出您正在寻找的结果。

#include <iostream>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

void Sharpen(Mat &image,Mat& result)
{
result.create(image.size(), image.type());

//For all rows except first and last
for(int i=1;i<image.rows-1;i++)
{
const uchar *previous = image.ptr<const uchar>(i-1);
const uchar *next = image.ptr<const uchar>(i+1);
const uchar *current = image.ptr<const uchar>(i);

uchar *output = result.ptr<uchar>(i);

//For all columns except first and last
for(int a=3;a<(image.cols-1)*3;a++)
{
output[a] = cv::saturate_cast<uchar>(5*current[a]-current[a-1]-current[a+1]-previous[a]-next[a]);
}

}

result.row(0).setTo(cv::Scalar(0));
result.row(result.rows-1).setTo(cv::Scalar(0));
result.col(0).setTo(cv::Scalar(0));
result.col(result.cols-1).setTo(cv::Scalar(0));

namedWindow("Original");
imshow("Original",image);

namedWindow("Duplicate");
imshow("Duplicate",result);

}

int main()
{
Mat image,result;

try
{
image = imread("C:/Users/Public/Pictures/Sample Pictures/Desert.jpg");

if(!image.data)
{
throw 1;
}
}
catch(int i)
{
cout << "Image is unable to reae" << endl;
}

Sharpen(image,result);
waitKey(0);
}

关于c++ - 锐化图像 - 访问相邻像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16117597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com