延展增加对比度

来源:互联网 发布:linux查看日志命令tail 编辑:程序博客网 时间:2024/04/30 02:32
/*延伸直方图均衡增加图像的对比度*/#include<opencv2\opencv.hpp>#include<iostream>using namespace cv;using namespace std;Mat stretch(const Mat& img, int minValue);Mat stretchV3(const Mat & img, int minValue);int main() {double t = getTickCount();Mat img = imread("D://图片//5.jpg");if (img.empty()) {cout << "加载失败" << endl;return -1;}int minVal = 0;cout << "请输入门槛值:" << endl;cin >> minVal;Mat result = stretch(img, minVal);Mat result2 = stretch(img, minVal);imshow("show_result", result);imshow("show_result2", result2);double Time = ((double)getTickCount() - t) / getTickFrequency();cout << "Time = " << Time << endl;waitKey(0);destroyAllWindows;return 0;}Mat stretch(const Mat & img, int minValue){Mat result;vector<Mat> channels;split(img, channels);             //这里只处理一个通道,多通道类似int min = 0;int max = 255;for ( ; min <= 255; min++) {if (channels[0].at<uchar>(min) > minValue) break;}for ( ; max >= 0; max--) {if (channels[0].at<uchar>(max) > minValue)break;}int dim(256);Mat lookUp(1, &dim, CV_8UC1);for (int i = 0; i < 256; i++) {if (i < min)lookUp.at<uchar>(i) = 0;else if (i > max)lookUp.at<uchar>(i) = 255;else {lookUp.at<uchar>(i) = 255 * (i - min) / (max - min);}}LUT(channels[0], lookUp, result);return result;}Mat stretchV3(const Mat & img, int minValue) {     //这里先转换成灰度图再执行全部的变换Mat result;Mat tem(img.size(), img.depth());cvtColor(img, tem, CV_BGR2GRAY);int min = 0;int max = 255;for (; min <= 255; min++) {if (tem.at<uchar>(min) > minValue)break;}for (; max >= 0; max--) {if (tem.at<uchar>(max) > minValue)break;}int dim(256);Mat lookUp(1, &dim, CV_8UC1);for (int i = 0; i < 256; i++) {if (i < min)lookUp.at<uchar>(i) = 0;else if (i > max)lookUp.at<uchar>(i) = 255;else {lookUp.at<uchar>(i) = 255 * (i - min) / (max - min);}}LUT(tem, lookUp, result);return result;}

效果图:


0 0
原创粉丝点击