1a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov/* 2a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * cv_image_sharp.cpp - image sharp 3a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * 4a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * Copyright (c) 2016-2017 Intel Corporation 5a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * 6a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * Licensed under the Apache License, Version 2.0 (the "License"); 7a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * you may not use this file except in compliance with the License. 8a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * You may obtain a copy of the License at 9a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * 10a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * http://www.apache.org/licenses/LICENSE-2.0 11a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * 12a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * Unless required by applicable law or agreed to in writing, software 13a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * distributed under the License is distributed on an "AS IS" BASIS, 14a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * See the License for the specific language governing permissions and 16a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * limitations under the License. 17a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * 18a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * Author: Andrey Parfenov <a1994ndrey@gmail.com> 19a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov * Author: Wind Yuan <feng.yuan@intel.com> 20a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov */ 21a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 22a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov#include "cv_image_sharp.h" 23a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 24a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenovnamespace XCam { 25a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 26a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 27a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey ParfenovCVImageSharp::CVImageSharp () 28be3ac1e217dd371c77983c812dfb149c258a3f42Andrey Parfenov : CVBaseClass () 29a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov{ 30a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 31a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov} 32a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 33a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenovcv::Mat 34a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey ParfenovCVImageSharp::sharp_image_gray (const cv::Mat &image, float sigmar) 35a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov{ 36a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat temp_image; 37a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov image.convertTo (temp_image, CV_32FC1); 38a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat bilateral_image; 39be3ac1e217dd371c77983c812dfb149c258a3f42Andrey Parfenov cv::bilateralFilter (temp_image, bilateral_image, 5, sigmar, 2); 40a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 41a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat sharp_filter = (cv::Mat_<float>(3, 3) << -1, -1, -1, -1, 8, -1, -1, -1, -1); 42a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat filtered_image; 43a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::filter2D (bilateral_image, filtered_image, -1, sharp_filter); 44a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::normalize (filtered_image, filtered_image, 0, 255.0f, cv::NORM_MINMAX); 45a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat sharpened = temp_image + filtered_image; 46a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::normalize (sharpened, sharpened, 0, 255.0f, cv::NORM_MINMAX); 47a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov return sharpened.clone (); 48a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov} 49a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 50a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenovfloat 51a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey ParfenovCVImageSharp::measure_sharp (const cv::Mat &image) 52a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov{ 53a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Mat dst; 54a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov cv::Laplacian (image, dst, -1, 3, 1, 0, cv::BORDER_CONSTANT); 55a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov dst.convertTo (dst, CV_8UC1); 56be3ac1e217dd371c77983c812dfb149c258a3f42Andrey Parfenov float sum = cv::sum (dst)[0]; 57a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov sum /= (image.rows * image.cols); 58a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov return sum; 59a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov} 60a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov 61a1fb1f1c9ab87798c9c05d74e66dacd7748e73a7Andrey Parfenov} 62