图像掩码操作的两种实现

#include <opencv2/imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>        
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <stdio.h>
using namespace cv; 
using namespace std;
// 基于像素邻域掩码操作
cv::Mat Myfilter2D(cv::Mat srcImage)
{	
	const int nChannels = srcImage.channels();
    cv::Mat resultImage(srcImage.size(),srcImage.type());
    for(int j = 1 ; j < srcImage.rows-1; ++j)
    {
    	// 获取邻域指针
        const uchar* previous = srcImage.ptr<uchar>(j - 1);
        const uchar* current  = srcImage.ptr<uchar>(j );
        const uchar* next     = srcImage.ptr<uchar>(j + 1);
        uchar* output = resultImage.ptr<uchar>(j);
        for(int i= nChannels;i < nChannels*(srcImage.cols-1); ++i)
        {
        	// 4-邻域均值掩码操作 
            *output++ = saturate_cast<uchar>(
            	(current[i-nChannels] + current[i+nChannels] +
            	 previous[i] + next[i])/4);
        }
    }
    // 边界处理
    resultImage.row(0).setTo(Scalar(0));
    resultImage.row(resultImage.rows-1).setTo(Scalar(0));
    resultImage.col(0).setTo(Scalar(0));
    resultImage.col(resultImage.cols-1).setTo(Scalar(0));
	return resultImage;
}
// 自带库掩码操作
cv::Mat filter2D_(cv::Mat srcImage)
{
    cv::Mat resultImage(srcImage.size(),srcImage.type());
    Mat kern = (Mat_<float>(3,3) <<  0,  1,  0,
                                    1,  0,  1,
                                    0,  1,  0)/ (float)(4);
    filter2D(srcImage, resultImage, srcImage.depth(), kern);
	return resultImage;
}
int main()
{
	cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg"); 
	if(!srcImage.data)
		return 0;	
	cv::Mat srcGray;
	cvtColor(srcImage, srcGray, CV_BGR2GRAY);
	imshow("srcGray", srcGray);
	cv::Mat resultImage = Myfilter2D(srcGray);
	imshow("resultImage", resultImage);
	cv::Mat resultImage2 = filter2D_(srcGray);
	imshow("resultImage2", resultImage2);
	cv::waitKey(0);	 
	return 0;
}

转载:http://blog.csdn.net/zhuwei1988


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值