環境:VS2012+OPENCV2.4.6
算法說明:
實現LOMO效果的三個步驟
?
第一、在綠色中提亮黃色,紅色偏品紅處理,藍色偏粉處理。將畫面整體提純,暗部做稍微的提亮。
第二、lomo風照片畫面中基本上只有兩個深度層次,主體和背景,你很難看準中間的過度,主體往往都比較清晰而背景呢往往都有比較大的模糊
第三、暗角較大。前面我們說過LOMO的照片畫面色彩艷麗,但是層次不鮮明,整體都是蒙蒙的感覺,因此照片整體看上去顯得比較平面,
往往主體突出得不夠,為了突出主體我們就必須給畫面做一個暗角。
源圖像
懷舊風
均衡化
模糊
LOMO嘗試
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{Mat image= imread("boldt.jpg");Mat new_image = Mat::zeros( image.size(), image.type() );for( int y = 0; y < image.rows; y++ ){for( int x = 0; x < image.cols; x++ ){
//第一、在綠色中提亮黃色,紅色偏品紅處理,藍色偏粉處理。將畫面整體提純,暗部做稍微的提亮。//其實這個地方開根號*10是非常不科學滴//藍色偏粉處理....我次奧,藍色怎么偏粉處理.....其實這個沒有實現出來啥好看的效果//new_image.at<Vec3b>(y,x)[0] = image.at<Vec3b>(y,x)[0];new_image.at<Vec3b>(y,x)[0] = 10*sqrt(image.at<Vec3b>(y,x)[0]);//綠色中提亮黃色new_image.at<Vec3b>(y,x)[1] = image.at<Vec3b>(y,x)[1];//new_image.at<Vec3b>(y,x)[1] = 10*sqrt(image.at<Vec3b>(y,x)[1]);//紅色偏品紅處理new_image.at<Vec3b>(y,x)[2] = image.at<Vec3b>(y,x)[2];//new_image.at<Vec3b>(y,x)[2] = 10*sqrt(image.at<Vec3b>(y,x)[2]);}}//merge(channels,image);namedWindow("original image");imshow("original image",image);namedWindow("懷舊風");imshow("懷舊風",new_image);
//調整下亮度啥的,個人感覺怎么對比度首先增強,然后再進行亮度增強Mat mergeImg;//合并后的圖像//用來存儲各通道圖片的向量vector<Mat> splitBGR(image.channels());//分割通道,存儲到splitBGR中split(image,splitBGR);//對各個通道分別進行直方圖均衡化for(int i=0; i<image.channels(); i++)equalizeHist(splitBGR[i],splitBGR[i]);//合并通道merge(splitBGR,mergeImg);namedWindow("equalizeHist");imshow("equalizeHist", mergeImg);//第二、lomo風照片畫面中基本上只有兩個深度層次,主體和背景,你很難看準中間的過度,主體往往都比較清晰而背景呢往往都有比較大的模糊Mat blur_image = Mat::zeros( image.size(), image.type() );blur(new_image,blur_image,Size( 8, 8), Point(-1,-1),BORDER_DEFAULT);namedWindow("blur image");imshow("blur image",blur_image);//第三、暗角較大。前面我們說過LOMO的照片畫面色彩艷麗,但是層次不鮮明,整體都是蒙蒙的感覺,因此照片整體看上去顯得比較平面,
//往往主體突出得不夠,為了突出主體我們就必須給畫面做一個暗角。Mat src=image;Mat res,roi,reverse_roi,reverse_res;res=Mat::zeros( image.size(), image.type() );reverse_res=Mat::zeros( image.size(), image.type() );//cout<<image.type()<<endl;roi=Mat::zeros( image.size(), image.type());//用來提取外面的輪廓,所以要求外面全是白色reverse_roi=Mat(image.size(),image.type());for( int y = 0; y < reverse_roi.rows; y++ ){for( int x = 0; x < reverse_roi.cols; x++ ){reverse_roi.at<Vec3b>(y,x)[0] = 255;reverse_roi.at<Vec3b>(y,x)[1] = 255;reverse_roi.at<Vec3b>(y,x)[2] = 255;}}//嘗試畫橢圓int thickness = 2;int lineType = 8;double angle=90;double w=image.rows;ellipse( roi, //輸入輸出的矩陣Point( 2*w/3.0, w/2.0 ),//點的中心Size( w/3.0, w/2.0 ),//軸線,軸心,坐標軸angle,//旋轉角度0,//開始角度360,//結束角度Scalar( 255, 255, 255 ),//畫線顏色thickness,//粗細程度lineType );//線的類型//在白色的區域畫黑線ellipse(reverse_roi, Point( 2*w/3.0, w/2.0 ), Size( w/3.0, w/2.0 ), angle,0,360,Scalar( 0, 0, 0 ),thickness,lineType );floodFill(reverse_roi, Point(w/2, w/2), Scalar( 0, 0, 0 ));//填充橢圓,這個填充絕對有問題啊有問題,果然需要Scalar( 255, 255, 255 ),而不是單純的255floodFill(roi, Point(w/2, w/2), Scalar( 255, 255, 255 ));image.copyTo(res,roi);//此處roi為maskimage.copyTo(reverse_res,reverse_roi);//把中間的感興趣區域的HSV中的亮度調高,飽和度提高.......cvtColor(res,res,CV_BGR2HSV);for( int y = 0; y < res.rows; y++ ){for( int x = 0; x < res.cols; x++ ){//飽和度0~1res.at<Vec3b>(y,x)[1] = res.at<Vec3b>(y,x)[1];//亮度0~1res.at<Vec3b>(y,x)[2] = res.at<Vec3b>(y,x)[2];}}cvtColor(res,res,CV_HSV2BGR);//把背景區域整體的HSV中的飽和度調高,亮度降低,為什么調飽和度會出現改變亮度的問題cvtColor(reverse_res,reverse_res,CV_BGR2HSV);for( int y = 0; y < reverse_res.rows; y++ ){for( int x = 0; x < reverse_res.cols; x++ ){reverse_res.at<Vec3b>(y,x)[1] = 1.5*reverse_res.at<Vec3b>(y,x)[1];if(reverse_res.at<Vec3b>(y,x)[1]>255){reverse_res.at<Vec3b>(y,x)[1]=255;}reverse_res.at<Vec3b>(y,x)[2] = reverse_res.at<Vec3b>(y,x)[2];}}cvtColor(reverse_res,reverse_res,CV_HSV2BGR);//主要是把外圍的進行blur//blur(reverse_res,reverse_res,Size( 8, 8), Point(-1,-1),BORDER_DEFAULT);//合并新的圖像reverse_res=reverse_res+res;/第三步之后重新處理第一第二步嘗試下for( int y = 0; y < image.rows; y++ ){for( int x = 0; x < image.cols; x++ ){//藍色偏粉處理....我次奧,藍色怎么偏粉處理.....其實這個沒有實現出來啥好看的效果//new_image.at<Vec3b>(y,x)[0] = image.at<Vec3b>(y,x)[0];reverse_res.at<Vec3b>(y,x)[0] = 10*sqrt(reverse_res.at<Vec3b>(y,x)[0]);//綠色中提亮黃色reverse_res.at<Vec3b>(y,x)[1] = reverse_res.at<Vec3b>(y,x)[1];//new_image.at<Vec3b>(y,x)[1] = 10*sqrt(image.at<Vec3b>(y,x)[1]);//紅色偏品紅處理reverse_res.at<Vec3b>(y,x)[2] = reverse_res.at<Vec3b>(y,x)[2];//new_image.at<Vec3b>(y,x)[2] = 10*sqrt(image.at<Vec3b>(y,x)[2]);}}//blur allblur(reverse_res,reverse_res,Size( 2, 2), Point(-1,-1),BORDER_DEFAULT);namedWindow("trial image");imshow("trial image",reverse_res);waitKey();}
總結
以上是生活随笔為你收集整理的OPENCV LOMO效果的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。