C++基于opencv制作的图像处理示例

#include<iostream>
#include<opencv2/opencv.hpp>
#include <string>
using namespace cv;
#define max2(a,b) (a>b?a:b)
#define max3(a,b,c) (a>b?max2(a,c):max2(b,c))
#define min2(a,b) (a<b?a:b)
#define min3(a,b,c) (a<b?min2(a,c):min2(b,c))

/*调节饱和度,0-200,是原来的%多少saturation*/
cv::Mat adjustSaturation(cv::Mat& image, int saturation) {
    CV_Assert(image.depth() == CV_8U && (image.channels() == 3 || image.channels() == 1));

    // 对于每个像素,将其转换到HSV色彩空间
    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);

    // 分离色调(Hue)、饱和度(Saturation)和亮度(Value)
    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    // 调整饱和度
    hsvChannels[1] *= saturation / 100.0;

    // 合并色调和亮度通道,并转换回BGR色彩空间
    cv::merge(hsvChannels, hsvImage);
    cv::cvtColor(hsvImage, image, cv::COLOR_HSV2BGR);
    return image;
}
//--------------------------------------------------------------------------------
// 饱和度-100-+100
cv::Mat Saturation(cv::Mat src, float saturation)
{
    float Increment = saturation * 1.0f / 100;
    cv::Mat temp = src.clone();
    int row = src.rows;
    int col = src.cols;
    for (int i = 0; i < row; ++i)
    {
        uchar* t = temp.ptr<uchar>(i);
        uchar* s = src.ptr<uchar>(i);
        for (int j = 0; j < col; ++j)
        {
            uchar b = s[3 * j];
            uchar g = s[3 * j + 1];
            uchar r = s[3 * j + 2];
            float max = max3(r, g, b);
            float min = min3(r,g, b);
            float delta, value;
            float L, S, alpha;
            delta = (max - min) / 255;
            if (delta == 0)
                continue;
            value = (max + min) / 255;
            L = value / 2;
            if (L < 0.5)
                S = delta / value;
            else
                S = delta / (2 - value);
            if (Increment >= 0)
            {
                if ((Increment + S) >= 1)
                    alpha = S;
                else
                    alpha = 1 - Increment;
                alpha = 1 / alpha - 1;
                t[3 * j + 2] = static_cast<uchar>(r + (r - L * 255) * alpha);
                t[3 * j + 1] = static_cast<uchar>(g + (g - L * 255) * alpha);
                t[3 * j] = static_cast<uchar>(b + (b - L * 255) * alpha);
            }
            else
            {
                alpha = Increment;
                t[3 * j + 2] = static_cast<uchar>(L * 255 + (r - L * 255) * (1 + alpha));
                t[3 * j + 1] = static_cast<uchar>(L * 255 + (g - L * 255) * (1 + alpha));
                t[3 * j] = static_cast<uchar>(L * 255 + (b - L * 255) * (1 + alpha));
            }
        }
    }
    return temp;
}
/*字符串长度*/
int mystrlen(const char* str)
{
    int stringlen = 0;
    while (*str++)stringlen++;
    return stringlen;
}
/*字符串比较,相等返回0,不相当返回1*/
int strcomp(char* str1, const char* str2)
{
    if (mystrlen(str1) != mystrlen(str2))return 1;
    while (*str1 != '\0')
    {
        if (*str1 == *str2)
        {
            str1++;
            str2++;
        }
        else return 1;
    }
    return 0;
}
/*求子串出现oice次的位置,从1开始计算*/
int myat(const char* substr, const char* str, int oice)
{
    //123,124jie4
    int i = 0;
    int j = 0;
    int k = 0;
    while (str[i] != '\0') {
        while (substr[j] != '\0' && str[i] == substr[j]) {
            i++; j++;
        }
        if (substr[j] == '\0') {
            k++;
            if (k == oice)return i - j + 1;
            else {
                j = 0;
            }
        }
        else {
            j = 0;
            i = i - j + 1;
        }
    }
    return 0;
}
/*字符串转换成整形*/
int str2int(const char* str)
{
    int temp = 0;
    const char* ptr = str;  //ptr保存str字符串开头
    if (*str == '-' || *str == '+')  //如果第一个字符是正负号,
    {                      //则移到下一个字符
        str++;
    }
    while (*str != 0)
    {
        if ((*str < '0') || (*str > '9'))  //如果当前字符不是数字
        {                       //则退出循环
            break;
        }
        temp = temp * 10 + (*str - '0'); //如果当前字符是数字则计算数值
        str++;      //移到下一个字符
    }
    if (*ptr == '-')     //如果字符串是以“-”开头,则转换成其相反数
    {
        temp = -temp;
    }
    return temp;
}
//--------------------------------------------------------------------------------
// 亮度与对比度
cv::Mat Brightness(cv::Mat src, float brightness, int contrast)
{
    cv::Mat dst;
    dst = cv::Mat::zeros(src.size(), src.type());        //新建空白模板:大小/类型与原图像一致,像素值全0。
    int height = src.rows;                                //获取图像高度
    int width = src.cols;                                //获取图像宽度
    float alpha = brightness;                            //亮度(0~1为暗,1~正无穷为亮)
    float beta = contrast;                                //对比度

    cv::Mat template1;
    src.convertTo(template1, CV_32F);                    //将CV_8UC1转换为CV32F1数据格式。
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            if (src.channels() == 3)
            {
                float b = template1.at<cv::Vec3f>(row, col)[0];        //获取通道的像素值(blue)
                float g = template1.at<cv::Vec3f>(row, col)[1];        //获取通道的像素值(green)
                float r = template1.at<cv::Vec3f>(row, col)[2];        //获取通道的像素值(red)

                //cv::saturate_cast<uchar>(vaule):需注意,value值范围必须在0~255之间。
                dst.at<cv::Vec3b>(row, col)[0] = cv::saturate_cast<uchar>(b * alpha + beta);        //修改通道的像素值(blue)
                dst.at<cv::Vec3b>(row, col)[1] = cv::saturate_cast<uchar>(g * alpha + beta);        //修改通道的像素值(green)
                dst.at<cv::Vec3b>(row, col)[2] = cv::sa

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

昕宇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值