图像增强——基于OpenCV的图像色彩增强
生活随笔
收集整理的這篇文章主要介紹了
图像增强——基于OpenCV的图像色彩增强
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
這是一個增強圖像色彩的demo,基于OpenCV,能很好的增強與銳化圖像中的色彩。
色彩增強
1.代碼
void colorEnhancement(cv::Mat &src, cv::Mat &dst, int filter) {cv::Mat orig_img = src.clone();cv::Mat simg;if (orig_img.channels() != 1){cvtColor(orig_img, simg, CV_BGR2GRAY);}else{return;}long int N = simg.rows*simg.cols;int histo_b[256];int histo_g[256];int histo_r[256];for(int i=0; i<256; i++){histo_b[i] = 0;histo_g[i] = 0;histo_r[i] = 0;}cv::Vec3b intensity;for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);histo_b[intensity.val[0]] = histo_b[intensity.val[0]] + 1;histo_g[intensity.val[1]] = histo_g[intensity.val[1]] + 1;histo_r[intensity.val[2]] = histo_r[intensity.val[2]] + 1;}}for(int i = 1; i<256; i++){histo_b[i] = histo_b[i] + filter * histo_b[i-1];histo_g[i] = histo_g[i] + filter * histo_g[i-1];histo_r[i] = histo_r[i] + filter * histo_r[i-1];}int vmin_b=0;int vmin_g=0;int vmin_r=0;int s1 = 3;int s2 = 3;while(histo_b[vmin_b+1] <= N*s1/100){vmin_b = vmin_b +1;}while(histo_g[vmin_g+1] <= N*s1/100){vmin_g = vmin_g +1;}while(histo_r[vmin_r+1] <= N*s1/100){vmin_r = vmin_r +1;}int vmax_b = 255-1;int vmax_g = 255-1;int vmax_r = 255-1;while(histo_b[vmax_b-1]>(N-((N/100)*s2))){ vmax_b = vmax_b-1;}if(vmax_b < 255-1){vmax_b = vmax_b+1;}while(histo_g[vmax_g-1]>(N-((N/100)*s2))){ vmax_g = vmax_g-1;}if(vmax_g < 255-1){vmax_g = vmax_g+1;}while(histo_r[vmax_r-1]>(N-((N/100)*s2))){ vmax_r = vmax_r-1;}if(vmax_r < 255-1){vmax_r = vmax_r+1;}for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);if(intensity.val[0]<vmin_b){intensity.val[0] = vmin_b;}if(intensity.val[0]>vmax_b){intensity.val[0]=vmax_b;}if(intensity.val[1]<vmin_g){intensity.val[1] = vmin_g;}if(intensity.val[1]>vmax_g){intensity.val[1]=vmax_g;}if(intensity.val[2]<vmin_r){intensity.val[2] = vmin_r;}if(intensity.val[2]>vmax_r){intensity.val[2]=vmax_r;}orig_img.at<cv::Vec3b>(i,j) = intensity;}}for(int i=0; i<simg.rows; i++){for(int j=0; j<simg.cols; j++){intensity = orig_img.at<cv::Vec3b>(i,j);intensity.val[0] = (intensity.val[0] - vmin_b)*255/(vmax_b-vmin_b);intensity.val[1] = (intensity.val[1] - vmin_g)*255/(vmax_g-vmin_g);intensity.val[2] = (intensity.val[2] - vmin_r)*255/(vmax_r-vmin_r);orig_img.at<cv::Vec3b>(i,j) = intensity;}} cv::Mat blurred;double sigma = 1;double threshold = 50;double amount = 1;GaussianBlur(orig_img, blurred, cv::Size(), sigma, sigma);cv::Mat lowContrastMask = abs(orig_img - blurred) < threshold;cv::Mat sharpened = orig_img*(1+amount) + blurred*(-amount);orig_img.copyTo(sharpened, lowContrastMask);dst = sharpened.clone(); }2.運行效果
總結
以上是生活随笔為你收集整理的图像增强——基于OpenCV的图像色彩增强的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV图像处理——copyTo与m
- 下一篇: OpenCV的图像处理——iOS与Ope