OpenCV中遍历图像与邻域操作

实验环境:

Windows10 x64
OpenCV2.4.11 + vs2013

实验目的:

练习使用图像遍历的方法;学习使用ptr,staturate_cast,Scalar, setTo,row,col 等函数;学习使用滤波函数cv::filter2D进行滤波操作;

代码示例:

#include
#include

using namespace cv;
using namespace std;

void Sharpen(const Mat& image, Mat& ret);
void sharpenByFilter2D(const Mat& image, Mat& ret);

int main()
{
    Mat image;
    image = imread("E:\\dataset\\images\\6.png");
    if (!image.data)
    {
        return -1;
    }
    Mat copy;
    image.copyTo(copy);

    //filter2D()
    namedWindow("before");
    imshow("before", image);

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

    namedWindow("sharpenByFilter2D");
    sharpenByFilter2D(copy, copy);
    imshow("sharpenByFilter2D", copy);

    cvWaitKey(-1);
    destroyAllWindows();
    return 0;
}

// 锐化算子公式: sharpened_pixel = 5 * current - left - right - up - down;
void Sharpen(const Mat& image, Mat& ret)
{
    CV_Assert(image.depth() == CV_8U); // accept only uchar images
    ret.create(image.size(), image.type()); // 保证和原图像素等一样大小

    const int nChannels = image.channels(); 

    // 除了第一行和最后一行,因为其邻域不完整
    for (int j = 1; j < image.rows - 1; ++j) 
    {
        const uchar* pre  = image.ptr(j-1);
        const uchar* cur  = image.ptr(j);
        const uchar* next = image.ptr(j + 1);
        uchar* output = ret.ptr(j);
        // 除了第一列和最后一列,因为其邻域不完整
        for (int i = nChannels; i < nChannels * (image.cols - 1); ++i)
        {
            // saturate_cast用于确保该值在0-255之间
            *output++ = saturate_cast(5*cur[i]-cur[i-nChannels]
                -cur[i+nChannels]-pre[i]-next[i]);
        }

    }
    // 将未处理的像素点简单的设置为0值
    if (nChannels == 1)
    {
        ret.row(0).setTo(Scalar(0));
        ret.row(ret.rows - 1).setTo(Scalar(0));
        ret.col(0).setTo(Scalar(0));
        ret.col(ret.cols - 1).setTo(Scalar(0));
    }
    else if (nChannels == 3)
    {
        ret.row(0).setTo(Scalar(0, 0, 0));
        ret.row(ret.rows - 1).setTo(Scalar(0, 0, 0));
        ret.col(0).setTo(Scalar(0, 0, 0));
        ret.col(ret.cols - 1).setTo(Scalar(0, 0, 0));
    }
}


void sharpenByFilter2D(const Mat& image, Mat& ret)
{
    // 定义一个图像滤波器(核),以使用cv::filter2D 进行图像滤波
    Mat kern = (Mat_(3, 3) << 0, -1, 0,
                                    -1, 5, -1,
                                    0, -1, 0);

    filter2D(image, ret, image.depth(), kern);
}

运行效果:

OpenCV中遍历图像与邻域操作_第1张图片

参考资料:

opencv_tutorials.pdf
OpenCV 2计算机视觉编程手册

你可能感兴趣的:(OpenCV学习笔记)