图像滤镜原理
?
?
?
? ? ? ? 喜歡拍照的朋友肯定都接觸過圖像濾鏡,一張圖加了濾鏡處理之后會有很意想不到的效果,今天說說圖像濾鏡的簡易原理。
其實圖像濾鏡就是對圖像的像素值有規(guī)律進行操作,下面介紹10種濾鏡的原理,用于測試的原圖如下圖所示:
1、黑白濾鏡
將彩色照片變成黑白照片,實質上是一個灰度化的過程。
彩色圖像的像素值有3個通道,r, g, b。灰度化的過程就是使三通道的像素值相等,即:
b = b;
g = b;
r = b;
//灰度濾鏡
void fun_gray(Mat &src, Mat &dst)
{dst = src.clone();for(int i=0;i<src.rows;i++)for (int j = 0; j < src.cols; j++){dst.at<Vec3b>(i, j)[0] = src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[2] = src.at<Vec3b>(i, j)[0];}return;
}
結果圖:
2、底片濾鏡
將彩色照片變成底片效果,實質是對像素值取反,即:
b = 255 - b;
g = 255 - g;
r =? 255?-?r;
//底片濾鏡
void fun_reverse(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){dst.at<Vec3b>(i, j)[0] = 255-src.at<Vec3b>(i, j)[0];dst.at<Vec3b>(i, j)[1] = 255-src.at<Vec3b>(i, j)[1];dst.at<Vec3b>(i, j)[2] = 255-src.at<Vec3b>(i, j)[2];}return;
}
效果圖:
3、換色濾鏡
將彩色照片換一種主色調,實質是取三通道r,g,b像素值的最大值和最小值的平均值,然后用該平均值代替某一通道的像素值,即:
value = max(r,g,b)+min(r,g,b)
b = value/2;
//換色濾鏡
void fun_changeColor(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int max_value = src.at<Vec3b>(i, j)[0]>src.at<Vec3b>(i, j)[1]?src.at<Vec3b>(i, j)[0]:src.at<Vec3b>(i, j)[1];max_value = max_value>src.at<Vec3b>(i, j)[2]? max_value:src.at<Vec3b>(i, j)[2];int min_value = src.at<Vec3b>(i, j)[0]<src.at<Vec3b>(i, j)[1] ? src.at<Vec3b>(i, j)[0] : src.at<Vec3b>(i, j)[1];min_value = min_value<src.at<Vec3b>(i, j)[2] ? min_value : src.at<Vec3b>(i, j)[2];int value = (max_value + min_value) / 2;dst.at<Vec3b>(i, j)[0] = value;//dst.at<Vec3b>(i, j)[1] = value;//dst.at<Vec3b>(i, j)[2] = value;}return;
}
效果圖:
?
?
4、懷舊濾鏡
將彩色照片的主色調換成一種懷舊的黃色,即:
b? = (272 * r + 534 * g + 131 * b) / 1000;
g?= (349 * r + 686 * g + 168 * b) / 1000;
r? = (393 * r + 769 * g + 189 * b) / 1000;
//懷舊濾鏡
void fun_old(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int b = src.at<Vec3b>(i, j)[0];int g = src.at<Vec3b>(i, j)[1];int r = src.at<Vec3b>(i, j)[2];int b_new = (272 * r + 534 * g + 131 * b) / 1000;int g_new = (349 * r + 686 * g + 168 * b) / 1000;int r_new = (393 * r + 769 * g + 189 * b) / 1000;if (b_new > 255) b_new = 255;if (g_new > 255) g_new = 255;if (r_new > 255) r_new = 255;dst.at<Vec3b>(i, j)[0] = b_new;dst.at<Vec3b>(i, j)[2] = g_new;dst.at<Vec3b>(i, j)[1] = r_new;}return;
}
效果圖:
5、火焰濾鏡
將彩色照片增加一種燃燒的效果,即:
b? =b*128/(g+r+1);
g?= g*128/(r+b+1);
r? = r*128/(g+b+1);
//熔巖濾鏡
void fun_fire(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int b = src.at<Vec3b>(i, j)[0];int g = src.at<Vec3b>(i, j)[1];int r = src.at<Vec3b>(i, j)[2];dst.at<Vec3b>(i, j)[0] = min(b*128/(g+r+1),255);dst.at<Vec3b>(i, j)[1] = min(g*128/(r+b+1),255);dst.at<Vec3b>(i, j)[2] = min(r*128/(g+b+1),255); }return;
}
效果圖:
?
6、冰封濾鏡
將彩色照片增加一種冰凍的效果,即:
b? =?(b - g - r) * 1.2;
g?= (g - r - b) * 1.2;
r? = (r - g - b) * 1.2;
//冰雕濾鏡
void fun_ice(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int b = src.at<Vec3b>(i, j)[0];int g = src.at<Vec3b>(i, j)[1];int r = src.at<Vec3b>(i, j)[2];int b_new = (b - g - r) * 1.2;int g_new = (g - r - b) * 1.2;int r_new = (r - g - b) * 1.2;dst.at<Vec3b>(i, j)[0] = b_new;dst.at<Vec3b>(i, j)[1] = g_new;dst.at<Vec3b>(i, j)[2] = r_new;}return;
}
效果可能不太好,如下圖:
7、卡通濾鏡
將彩色照片增加一種卡通的效果,即:
b? =?abs(b - g + b + r) * g / 256;
g?= abs(b - g + b + r) * r / 256;
r? = abs(g - b + g + r) * r / 256;
//卡通濾鏡
void fun_cartoon(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int b = src.at<Vec3b>(i, j)[0];int g = src.at<Vec3b>(i, j)[1];int r = src.at<Vec3b>(i, j)[2];int b_new = abs(b - g + b + r) * g / 256;int g_new = abs(b - g + b + r) * r / 256;int r_new = abs(g - b + g + r) * r / 256;if (b_new > 255) b_new = 255;if (g_new > 255) g_new = 255;if (r_new > 255) r_new = 255;dst.at<Vec3b>(i, j)[0] = b_new;dst.at<Vec3b>(i, j)[1] = g_new;dst.at<Vec3b>(i, j)[2] = r_new;}return;
}
效果圖:
8、浮雕濾鏡
將彩色照片增加一種浮雕的效果,即根據(jù)像素點灰度梯度值設置像素,即:
value = b1-b2;? (b1和b2為相鄰像素點的像素值)
b? =?value + 128;
g?= ?value + 128;
r? = ?value + 128;? //128是為了將梯度增加,可以更改
//浮雕濾鏡
void fun_floor(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 1; i<src.rows; i++)for (int j = 1; j < src.cols; j++){int value1 = src.at<Vec3b>(i, j)[0]- src.at<Vec3b>(i-1, j)[0];//int value2 = src.at<Vec3b>(i, j)[1] - src.at<Vec3b>(i - 1, j)[1]; //int value3 = src.at<Vec3b>(i, j)[2] - src.at<Vec3b>(i - 1, j)[2];dst.at<Vec3b>(i, j)[0] = value1+128;dst.at<Vec3b>(i, j)[1] = value1+128;dst.at<Vec3b>(i, j)[2] = value1+128;}return;
}
效果圖:
9、素描濾鏡
將彩色照片增加一種素描的效果,即:
對圖像求灰度圖A和底片圖B,將灰度圖經過高斯濾波之后,和底片圖疊加,然后再將像素值較小調整為0。
//素描濾鏡
void fun_paint(Mat &src, Mat &dst)
{dst = src.clone();cvtColor(src, dst, CV_BGR2GRAY);Mat gray = dst.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){dst.at<uchar>(i, j) = 255 - dst.at<uchar>(i, j);}GaussianBlur(dst, dst, Size(15, 15), 0, 0);dst = dst + gray;for (int i = 0; i<src.rows; i++){ for (int j = 0; j < src.cols; j++){if(dst.at<uchar>(i, j)<50)dst.at<uchar>(i, j) = 0;}}
}
效果圖:
10、曝光濾鏡
將彩色照片增加一種過度曝光的效果,實質上是一種簡單的圖像增強,即像素值乘以一個系數(shù)即可。
b = b+b*1.2;
g = g+g*1.2;
r = r+r*1.2;? ?//1.2可以更改。
//曝光濾鏡
void fun_exposure(Mat &src, Mat &dst)
{dst = src.clone();for (int i = 0; i<src.rows; i++)for (int j = 0; j < src.cols; j++){int b = src.at<Vec3b>(i, j)[0];int g = src.at<Vec3b>(i, j)[1];int r = src.at<Vec3b>(i, j)[2];int b_new = b + b*1.2;int g_new = g + g*1.2;int r_new = r + r*1.2;if (b_new > 255) b_new = 255;if (g_new > 255) g_new = 255;if (r_new > 255) r_new = 255;dst.at<Vec3b>(i, j)[0] = b_new;dst.at<Vec3b>(i, j)[1] = g_new;dst.at<Vec3b>(i, j)[2] = r_new;}return;
}
效果圖:
?
總結
- 上一篇: 使用RxJava和SseEmitter进
- 下一篇: java se和java_Java:改进