標籤:
閑的時候用OpenCV畫漫畫也挺有意思,雖然效果不好(達不到上面所實現的效果),
參數需要調整,還是大頭貼而且雜訊小的映像比較合適
而且可以熟悉一下關於各種濾波的操作比如:雙邊濾波;
[cpp] view plain copy print?
- #include "cv.h"
- #include "highgui.h"
-
- using namespace cv;
- using namespace std;
-
- int main()
- {
- string name="D:/cartoon0.jpg";
- Mat src1=imread(name,1);
- Mat img;
- //雙邊濾波,第3個參數d可以說d>5時不能即時處理,最後兩個參數是sigma參數,一般相同,
- //<10時基本沒效果, >150時漫畫效果
- bilateralFilter(src1,img,5,150,150);
- bilateralFilter(img,src1,5,150,150);
- //img.copyTo(src1);
-
- imshow("bilateral",src1);
- waitKey(0);
-
- Mat src;
- cvtColor(src1,src,CV_BGR2GRAY);
- //粗線,越大越粗,但是會有大量噪點
- Mat imgL;
- //第三個參數ddepth表示靶心圖表像的深度,ddepth=-1時,與原映像一致
- Laplacian(src,imgL,-1,3,1);
- imshow("Laplacian",imgL);
- waitKey(0);
- //細線
- Mat imgC;
- Canny(src,imgC,30,90);
- imshow("Canny",imgC);
- waitKey(0);
-
- Mat imgS,imgSx,imgSy,imgS0;
- Sobel(src,imgSx,-1,0,1);
- Sobel(src,imgSx,-1,1,0);
- imgS=imgSx+imgSy;
- Sobel(src,imgS0,-1,1,1);
- imshow("Sobel0",imgS0);
- imshow("Sobel",imgS);
- waitKey(0);
-
- Mat imgTotal;
- imgTotal=imgC+imgS+imgL;
- //imgTotal.convertTo(imgTotal,CV_32FC1);
- normalize(imgTotal,imgTotal,255,0,CV_MINMAX);
- GaussianBlur(imgTotal,imgTotal,Size(3,3),3);
- threshold(imgTotal,imgTotal,100,255,THRESH_BINARY_INV);
- imshow("Total",imgTotal);
- waitKey(0);
-
- Mat imgTotalC3;
- cvtColor(imgTotal,imgTotalC3,CV_GRAY2BGR);
- bitwise_and(src1,imgTotalC3,src1);
- imshow("Result",src1);
- waitKey(0);
-
-
- name.insert(11,"_edge");
- imwrite(name,src1);
-
- /*
- Mat img(imgTotal.rows,imgTotal.cols,CV_32FC1);
- for(int i=0;i<imgTotal.rows;i++)
- {
- //uchar* p=(uchar*)(imgTotal.ptr()+i*imgTotal.step);
- for(int j=0;j<imgTotal.cols;j++)
- {
- if(imgTotal.at<float>(i,j)==0)
- img.at<float>(i,j)=1;
- }
- }
- imshow("Reverse",img);
- waitKey(0);
- */
- /*
- Mat imgSc;
- Scharr(src,imgSc,-1,1,0);
- imshow("Scharr",imgSc);
- waitKey(0);
- */
-
- }
from: http://blog.csdn.net/yangtrees/article/details/7544481
學習OpenCV——用OpenCv畫漫畫