opencv [c++] 利用滚动条进行对比度与亮度调节以及拆分颜色通道

18 篇文章 42 订阅

 1.利用滚动条TrackBar进行对比度与亮度调节

#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

Mat srcImg;
Mat dstImg;
int Contrast_value = 20;
int Bright_value = 20;
//滚动条回调事件
void onChange(int, void*)
{
	for (int i = 0; i < srcImg.rows; i++)
	{
		for (int j = 0; j < srcImg.cols; j++)
		{
			//三个通道的对比度与亮度调节 以及 溢出保护
 			dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>((Contrast_value * 0.01 * srcImg.at<Vec3b>(i, j)[0])+ Bright_value);
			dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>((Contrast_value * 0.01 * srcImg.at<Vec3b>(i, j)[1]) + Bright_value);
			dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>((Contrast_value * 0.01 * srcImg.at<Vec3b>(i, j)[2]) + Bright_value);
		}
	}
	imshow("输出窗口", dstImg);
}



int main()
{
	srcImg = imread("ROI.bmp");
	dstImg = Mat::zeros(srcImg.size(), srcImg.type());
	namedWindow("输出窗口", WINDOW_NORMAL);
	createTrackbar("对比度:", "输出窗口", &Contrast_value, 300, onChange, 0);
	createTrackbar("亮度:", "输出窗口", &Bright_value, 200, onChange, 0);

    //给滚动条回调函数赋初值
	onChange(Contrast_value, 0);
	onChange(Bright_value, 0);

	imshow("original image", srcImg);
	waitKey(0);
}

结果图示:

2.OpenCV拆分颜色通道

#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

Mat srcImg, dstImg;
Mat R, G, B;
vector<Mat> channels;

int main()
{
	srcImg = imread("ROI.bmp");
	namedWindow("output", WINDOW_NORMAL);
	resizeWindow("output", 512, 512);
	split(srcImg, channels);
	B = channels[0];
	G = channels[1];
	R = channels[2];

	imshow("output", srcImg);
	imshow("B", B);
	imshow("G", G);
	imshow("R", R);
	waitKey(0);
}

3.RGB-->HSV颜色空间筛选示例 

#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include <iostream>
using namespace cv;

/** Global Variables */
const int max_value_H = 360 / 2;
const int max_value = 255;
const String window_capture_name = "Video Capture";
const String window_detection_name = "Object Detection";
int low_H = 0, low_S = 0, low_V = 0;
int high_H = max_value_H, high_S = max_value, high_V = max_value;

//! [low]
static void on_low_H_thresh_trackbar(int, void*)
{
    low_H = min(high_H - 1, low_H);
    setTrackbarPos("Low H", window_detection_name, low_H);
}
//! [low]

//! [high]
static void on_high_H_thresh_trackbar(int, void*)
{
    high_H = max(high_H, low_H + 1);
    setTrackbarPos("High H", window_detection_name, high_H);
}

//! [high]
static void on_low_S_thresh_trackbar(int, void*)
{
    low_S = min(high_S - 1, low_S);
    setTrackbarPos("Low S", window_detection_name, low_S);
}

static void on_high_S_thresh_trackbar(int, void*)
{
    high_S = max(high_S, low_S + 1);
    setTrackbarPos("High S", window_detection_name, high_S);
}

static void on_low_V_thresh_trackbar(int, void*)
{
    low_V = min(high_V - 1, low_V);
    setTrackbarPos("Low V", window_detection_name, low_V);
}

static void on_high_V_thresh_trackbar(int, void*)
{
    high_V = max(high_V, low_V + 1);
    setTrackbarPos("High V", window_detection_name, high_V);
}

int main(int argc, char* argv[])
{
    //! [cap]
    VideoCapture cap(argc > 1 ? atoi(argv[1]) : 0);
    //! [cap]

    //! [window]
    namedWindow(window_capture_name);
    namedWindow(window_detection_name);
    //! [window]

    //! [trackbar]
    // Trackbars to set thresholds for HSV values
    createTrackbar("Low H", window_detection_name, &low_H, max_value_H, on_low_H_thresh_trackbar);
    createTrackbar("High H", window_detection_name, &high_H, max_value_H, on_high_H_thresh_trackbar);
    createTrackbar("Low S", window_detection_name, &low_S, max_value, on_low_S_thresh_trackbar);
    createTrackbar("High S", window_detection_name, &high_S, max_value, on_high_S_thresh_trackbar);
    createTrackbar("Low V", window_detection_name, &low_V, max_value, on_low_V_thresh_trackbar);
    createTrackbar("High V", window_detection_name, &high_V, max_value, on_high_V_thresh_trackbar);
    //! [trackbar]

    Mat frame, frame_HSV, frame_threshold;
    while (true) {
        //! [while]
        cap >> frame;
        if (frame.empty())
        {
            break;
        }

        // Convert from BGR to HSV colorspace
        cvtColor(frame, frame_HSV, COLOR_BGR2HSV);
        // Detect the object based on HSV Range Values
        inRange(frame_HSV, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), frame_threshold);
        //! [while]

        //! [show]
        // Show the frames
        imshow(window_capture_name, frame);
        imshow(window_detection_name, frame_threshold);
        //! [show]

        char key = (char)waitKey(30);
        if (key == 'q' || key == 27)
        {
            break;
        }
    }
    return 0;
}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用OpenCV和C来实现图片的对比度亮度和伽马值调节,可以按照以下步骤进行: 1. 加载图片 使用OpenCV中的cvLoadImage函数来加载图片,例如: ```c IplImage* img = cvLoadImage("image.jpg", CV_LOAD_IMAGE_COLOR); ``` 2. 调整亮度 亮度可以通过修改图像中所有像素的像素值来实现。可以使用以下代码来增加或减少亮度: ```c int brightness = 50; // 亮度增加值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = *pixel + brightness; *pixel = (value > 255) ? 255 : (uchar)value; } } } ``` 3. 调整对比度 对比度可以通过修改图像中的像素值范围来实现。可以使用以下代码来增加或减少对比度: ```c float contrast = 1.5; // 对比度增加值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = (int)(*pixel - 128) * contrast + 128; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } ``` 4. 调整伽马值 伽马值可以通过将图像中的像素值进行幂运算来实现。可以使用以下代码来调整伽马值: ```c float gamma = 0.5; // 伽马值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = pow((float)(*pixel / 255.0), gamma) * 255; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } ``` 5. 保存图片 使用OpenCV中的cvSaveImage函数来保存修改后的图片,例如: ```c cvSaveImage("result.jpg", img); ``` 完整代码如下: ```c #include <cv.h> #include <highgui.h> #include <math.h> int main(int argc, char** argv) { IplImage* img = cvLoadImage("image.jpg", CV_LOAD_IMAGE_COLOR); // 调整亮度 int brightness = 50; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = *pixel + brightness; *pixel = (value > 255) ? 255 : (uchar)value; } } } // 调整对比度 float contrast = 1.5; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = (int)(*pixel - 128) * contrast + 128; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } // 调整伽马值 float gamma = 0.5; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = pow((float)(*pixel / 255.0), gamma) * 255; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } cvSaveImage("result.jpg", img); cvReleaseImage(&img); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NCUTer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值