假設(shè)有如下銳化公式:
sharpened_pixel = 5 * current - left - right - up - down
代碼實(shí)現(xiàn)如下:
void Sharpen(const cv::Mat& image, cv::Mat& result)
{
#ifndef _USE_KERNEL
result.create(image.size(), image.type());
int nchannels = image.channels();
for (int i = 1; i < image.rows - 1; i++) {
const uchar* previous = image.ptr<const uchar>(i - 1); // 上一行
const uchar* current = image.ptr<const uchar>(i); // 當(dāng)前行
const uchar* next = image.ptr<const uchar>(i + 1); // 下一行
uchar* output = result.ptr<uchar>(i);
for (int j = 0; j < (image.cols - 1) * nchannels; j++) {
// 應(yīng)用銳化算子
*output++ = cv::saturate_cast<uchar>(
5 * current[j] - current[j - nchannels] - current[j + nchannels] - previous[j] - next[j]);
}
}
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));
return;
#endif // !_USE_KERNEL
cv::Mat kernel(3,3,CV_32F, Scalar(0));
kernel.at<float>(1, 1) = 5.0;
kernel.at<float>(0, 1) = -1.0;
kernel.at<float>(2, 1) = -1.0;
kernel.at<float>(1, 0) = -1.0;
kernel.at<float>(1, 2) = -1.0;
cout << image.depth() << endl;
cv::filter2D(image, result, image.depth(), kernel);
}
其中卷積函數(shù):
CV_EXPORTS_W void filter2D( InputArray src, OutputArray dst, int ddepth,
InputArray kernel, Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
src :輸入圖像
dst:輸出圖像
ddepth:目標(biāo)圖像的期望深度
kernel:卷積核
anchor:內(nèi)核的錨點(diǎn),表示內(nèi)部經(jīng)過過濾的點(diǎn)的相對位置內(nèi)核;錨應(yīng)該位于內(nèi)核內(nèi);默認(rèn)值(-1艰赞,-1)表示錨點(diǎn)在內(nèi)核中心
delta:offset值佣谐,默認(rèn)為0
borderType:邊界填充的類型,在濾波的過程中方妖,會根據(jù)濾波器的尺寸在圖像的邊界填充一定的數(shù)量的像素值狭魂,以保證輸入與輸出具有相同的尺寸,這個參數(shù)指定邊界填充的規(guī)則;目前支持一下幾種規(guī)則
enum BorderTypes {
BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i`
BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`
BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb`
BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg`
BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`
BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`
BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101
BORDER_ISOLATED = 16 //!< do not look outside of ROI
};