您的位置:首页 > 运维架构

opencv实现双边滤波 + 锐化

2017-11-28 16:11 483 查看
opencv实现双边滤波 + 锐化代码:void sharpen(const cv::Mat image, cv::Mat &result){result.create(image.size(), image.type());for (int j = 1; j < image.rows - 1; j++){const uchar* previous = image.ptr<const uchar>(j - 1);const uchar* current = image.ptr<const uchar>(j);const uchar* next = image.ptr<const uchar>(j + 1);uchar* output = result.ptr<uchar>(j);for (int i = 1; i < image.cols - 1; i++){//sharpened_pixel = 5*current-left-right-up-down;  //cv::saturate_cast用以对计算结果进行截断(0-255)  *output++ = cv::saturate_cast<uchar>(5 * current[i] - current[i - 1]- current[i + 1] - previous[i] - next[i]);}}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));}int main(int argc, char* argv[]) {/*IplImage *src = cvLoadImage("E:\\IR1024.bmp", -1);cvShowImage("ty", src);int a;a=src->nChannels;cvWaitKey(0);printf("channel is %d:",a);*/Mat img;img= imread("E:\\butterfly_GT.bmp");cv::cvtColor(img, img, CV_BGR2GRAY);Mat resultoffilter;bilateralFilter(img, resultoffilter, 10, 10 * 2, 10 / 2);Mat result;result.create(resultoffilter.size(), resultoffilter.type());sharpen(resultoffilter, result);namedWindow("sharpen");namedWindow("img");imshow("img", resultoffilter);        cvtColor(result, result, CV_GRAY2RGB);imshow("sharpen", result);cv::imwrite("E:\\IR1024.bmp", result);waitKey(0);system("pause");return 0;}注意:(1)cv::saturate_cast用以对计算结果进行截断,对数值的数学计算常常超出允许的计算范围,解决方案是直接映射到(0-255)(2)row和col方法。返回一个特殊的、仅包含一行或一列的cv::Mat实例。在这个过程中没有任何的数据拷贝,如果该一维矩阵遭到修改也会相应的修改原始图像。(3)setTo函数将矩阵的所有元素设为指定值。
因为是图像第一行,最后一行,第一列,最后一列没处理,将其置为0
        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));
将图像的第一行的所有像素设置为0.三通道的图像,需要使用cv::Scalar(a,b,c)来指定像素三个通道的目标值。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: