边缘检测是制作暗黑校园童话的强有力武器
手残果然会崩坏了美好的毕业照片,把好好的青春回忆变成了暗黑系恐怖片,原图坚决不能放,没有对比都已经把审美扭曲成这样了。
我们这里仅仅是在感官层面上来认识下sobel,laplacian,canny三种算子的区别。canny边缘线条的粗细程度是一样的。laplacian (二阶微分算子) 对于边缘的检测很敏感,可以检测到更对的信息,但是相应的,噪声也会很多。sobel (梯度算子)不太符合人眼睛的视觉原理。
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
String imageName("/home/warmtree/下载/M1_ComputerVision/Lab2/sky.jpeg");
//char* imageName = argv[1]; //图像路径
Mat image;
Mat lena; //新建图像对象
image = imread(imageName, 1); //1 表示BGR格式读取
lena = imread(imageName, 1);
// if (argc != 2 || !image.data) //image.empty()
// {printf(" No image data \n ");return -1;}
Mat gray_image;
Mat sep_image;
Mat gaussian_image;
cvtColor(image, gray_image, COLOR_BGR2GRAY); //颜色通道转换 BGR-->Gray
// separable filter
Mat kernel = cv::getGaussianKernel(7, 1.5, CV_32F);
sepFilter2D(image, sep_image, -1, kernel, kernel);
GaussianBlur(image, gaussian_image, cv::Size(7, 7), 1.5);
Mat sobel,laplacian,canny;
Sobel(lena,sobel,CV_8U,1,1);
Laplacian(lena,laplacian,CV_8U,1,1);
Canny(lena,canny, 100, 200);
namedWindow("sobel", WINDOW_AUTOSIZE); //新建窗口
namedWindow("laplacian", WINDOW_AUTOSIZE);
namedWindow("canny", WINDOW_AUTOSIZE);
imshow("sobel", sobel);
imshow("laplacian", laplacian);
imshow("canny", canny);
Mat image2,image_blur,image_r;
image2 = 255 - gray_image; //对图片的取反操作
cv::GaussianBlur(image2, image_blur,cv::Size2i(25,25),0,0); //用高斯模糊进行处理
image_blur = 255 - image_blur; //高斯模糊处理后的图像在进行取反
cv::divide(image2, image_blur,image_r,256); //利用divide除法实现图片亮化
//cv::imwrite("filename", image_r); //保存图片
cv::imshow("image",image_r);
waitKey();
/*
//imwrite("../../images/Gray_Image.jpg", gray_image); //保存图像
namedWindow("Original image", WINDOW_AUTOSIZE); //新建窗口
namedWindow("Gray image", WINDOW_AUTOSIZE);
namedWindow("Result", WINDOW_AUTOSIZE);
imshow("Original image", image); //与窗口对应来显示图片
imshow("Gray image", gray_image);
imshow("sep_Result",sep_image);
imshow("gaussian_image",gaussian_image);
waitKey(0); //0ms 表示无限等待 知道用户按下按键
*/
destroyAllWindows(); //关闭所有窗口
return 0;
}
很明显,有个地方很不对劲,学士服明明是黑色的,但是,我这里面也太亮了。进行了色彩取反操作,进行边缘的叠加,效果突然好了那么一丢丢(有点像黑白漫画了。云层那块黑线有点奇怪。
双边滤波器的原理与参数效果,一个点的滤波后的像素值由他邻域内的像素点决定,通过距离和相似度来确定加权系数。
image_r = canny+image2;
cv::imshow("image",225-image_r);
残留问题:如何把黑白漫画转化成彩色漫画?