作为自己的入门OpenCV入门第一步,稍微写写感受免得自己这个“烂硬盘”不时的消磁了就麻烦了
首先就直接贴出代码块了:(3*3锐化滤波器)
#include <stdio.h>
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv; //链接下文中所有函数至cv空间中查找
int main()
{
//读取本地的一张图片便显示出来
Mat img = imread("card.jpeg");
if (!img.data){ //检查图像是否读入
printf("Image not find!");
return -1;
}
namedWindow("Input image", WINDOW_AUTOSIZE);
imshow("Input image", img);
int cols = (img.cols - 1) * img.channels(); //获取像素行个数
int rows = img.rows; //确定像素列个数
uchar offsetx = img.channels(); //获取通道数
Mat out = Mat::zeros(img.size(), img.type()); //建立空图像
for (int row=1;row<rows-1;row++)
{
const uchar *current = img.ptr<uchar>(row);
const uchar *previous = img.ptr<uchar>(row - 1);
const uchar *next = img.ptr<uchar>(row + 1);
uchar *output = out.ptr<uchar>(row);
for (int col = offsetx; col < cols; col++){
output[col] =saturate_cast<uchar>( 5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col])); //限定输出图像数值
}
}
namedWindow("output image",WINDOW_AUTOSIZE);
imshow("output image", out);
waitKey(0);
return 0;
}
作为OpenCV4.0对于之前版本的改变其实在这里已经略微的有所体现了,相较于之前3.x时代的namedWindow()函数其窗口设定中的“CV_WINDOW_AUTOSIZE”被变更为“WINDOW_AUTOSIZE”去掉了一部分前缀"CV _"。
备注:
在编辑过程中碰到的一个脑子没转过弯来的问题,对于处理一个稍大的图像时我尝试将行列指针与行列数据变量使用相同的数据类型,并尝试将prt函数后的回传参数类型内的uchar变更为int,则指针溢出。完全是因为我没搞清楚这地方的uchar并非与当前的行列数有关而与图片中的像素的色值有关。ORZ