开始之前
在准备开始的时候, 我大概列了一个opencv 章节列表, 按照章节进行写, 写到某些部分的时候再具体调整章节内容, 完成了之后, 会将具体的章节链接更新到这个列表中 算是作为一个目录吧.
有的章节写到很快, 有的章节写的很慢, 但是我会坚持一直写下去
目录
开始
按照我的写作计划, 之前算是完成了前面的大的章节, 我们开始正式进入图像处理的章节了, 在之前的章节中,我们介绍了图像的遍历操作, 我们从一个基础的问题出发, 我们对于每一点的像素值, 每个点减去他上面边的点的值作为结果值, 那我们会得到什么图呢,
图像下侧差分
这我们为了简单运算吧, 我们提前将结果初始化为0, 然后将每一行的像素减去它上面的像素, 作为结果当前点的颜色值 我们看下代码以及跑起来看下会是什么结果
int main(int argc, char *argv[])
{
// 设置 要显示的图像路径
std::string lena_png = "./TestImages/lena.png";
cv::Mat src_img = cv::imread(lena_png);
cv::Mat res_img = cv::Mat::zeros(src_img.size(), CV_8UC3);
// 初始化所有结果为 0 第一行不存在上一行, 默认为0 彩色图像 每个通道都计算
for (int i = 1; i < src_img.rows; i++)
{
for (int j = 0; j < src_img.cols; j++)
{
for (int k = 0; k < src_img.channels(); k++)
{
res_img.at<cv::Vec3b>(i, j)[k] = src_img.at<cv::Vec3b>(i, j)[k] - src_img.at<cv::Vec3b>(i-1, j)[k];
}
}
}
cv::imshow("src_img", src_img);
cv::imshow("res_img", res_img);
cv::waitKey(0);
return 0;
// return a.exec();
}
其中核心部分就是计算 res_img.at<cv::Vec3b>(i, j)[k] = src_img.at<cv::Vec3b>(i, j)[k] - src_img.at<cv::Vec3b>(i-1, j)[k];
颜色部分, 我们的 i 从第一行开始的 所以不会出现索引出错, 这个操作比较简单, 我们得到了下面的图像结果,
图像锐化操作
我们这里说一下, 在之前的章节也都提过, 在图像处理的过程中, 我们一般采用的是灰度图像, 能够有效的获取到图像的细节特征, 而且计算起来比较方便, 所以我们在后续进行一下算法处理的时候会采用灰度图像, 特此说明
根据opencv 例程Mask operations on matrices 中提到的一个案例, 我计算一个点与它四邻域的的差值的 也就是
g ( i , j ) = f ( i , j ) + ( f ( i , j ) − f ( i − 1 , j ) ) + ( f ( i , j ) − f ( i , j − 1 ) ) + ( f ( i , j ) − f ( i , j + 1 ) ) + ( f ( i , j ) − f ( i + 1 , j ) ) ; g(i,j) = f(i,j) + (f(i,j)-f(i-1,j))+ (f(i,j)-f(i,j-1))+ (f(i,j)-f(i,j+1))+ (f(i,j)-f(i+1,j)); g(i,j)=f(i,j)+(f(i,j)−