CV图像基本操作【2】——亮度对比度调整与背景相减(得前景)

编程环境:

VS + OpenCV + C++
完整代码已经更新至GitHub,欢迎fork~GitHub链接


声明:创作不易,未经授权不得复制转载
statement:No reprinting without authorization


内容:

对比度及亮度的基本调整原理公式为:g(i,j) = af(i,j) + b*
->g 变换后图像
->f 变换前原图
->a 用于控制对比度
->b 用于控制亮度

1.1:对比度调整

       设计一个Sigmoid函数,实现对图像的对比度调整;使用opencv窗口系统的slider控件,交互改变Sigmoid函数的参数,实现不同程度的对比度调整;

1.2:背景相减

       对图像I和对应的背景图B,基于背景相减检测I中的前景区域,设法改进结果。

一、线性函数对比度亮度调节:

code
#include<opencv2/core/core.hpp>
#include<opencv2/imgcodecs.hpp>
#include<opencv2/core/saturate.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream> 

using namespace std;
using namespace cv;

int main(int, char** argv)
{
    double alpha = 1.0; /*< Simple contrast control */
    int beta = 0;       /*< Simple brightness control */

    Mat image = imread("a.png");
    //cvtColor(image, image, CV_BGR2GRAY);//转为灰度图
    Mat new_image = Mat::zeros(image.size(), image.type());

    cout << " Basic Linear Transforms " << endl;
    cout << "-------------------------" << endl;
    cout << "* Enter the alpha value [1.0-3.0]: "; cin >> alpha;
    cout << "* Enter the beta value [0-100]: ";    cin >> beta;

    for (int y = 0; y < image.rows; y++) {
        for (int x = 0; x < image.cols; x++) {
            for (int c = 0; c < 3; c++) {
                new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta);
            }
        }
    }

    namedWindow("Original Image", WINDOW_AUTOSIZE);
    namedWindow("New Image", WINDOW_AUTOSIZE);

    imshow("Original Image", image);
    imshow("New Image", new_image);

    waitKey();
    return 0;
}

二、sigmoid函数对比度亮度调节:

image.png
(1)首先应用公式
image.png

(引用自论文A New Approach for Contrast Enhancement Using Sigmoid Function——Naglaa Hassan and Norio Akamatsul)对每个像素点进行处理,发现效果并不好,容易高亮丢失纹理(受参数C的影响太大),实用效果差如下图:


image.png

image.png
(2)自行设计调整函数:

t = I(x,y) / 255.00 * c_p * 0.1; //c_p为界面可动态调整参数
O(x,y) = I(x,y) ( ( 1.00/ ( 1.00+exp ( -t) ) + 0.5 ) + b_value - 100)
应用新公式测试效果如下:

image.png

(3)发现还是会有一些纹理丢失,思考后认为255/200-1<0.3,所以应该将0.5这个参数调低至0.3,调低为0.3后进行测试效果较好,达到预期效果。:
image.png

image.png
code:
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include<math.h>
#include <iostream>

using namespace std;
using namespace cv;

static void ContrastAndBright(int, void *);

int c_p;
int b_value;
Mat s_image, t_imag;

int main()
{
    s_image = imread("22.png");

    if (!s_image.data)
    {
        cout << "图片读取失败!" << endl;
        return false;
    }
    t_imag = Mat::zeros(s_image.size(), s_image.type());

    c_p = 20;
    b_value = 100;

    namedWindow("效果图窗口", WINDOW_AUTOSIZE);

    createTrackbar("对比度", "效果图窗口", &c_p, 200, ContrastAndBright);
    createTrackbar("亮  度", "效果图窗口", &b_value, 200, ContrastAndBright);

    ContrastAndBright(c_p, 0);
    ContrastAndBright(b_value, 0);

    waitKey(0);
    return 0;

}

static void ContrastAndBright(int, void *)
{

    namedWindow("窗口02", WINDOW_AUTOSIZE);
    // g_dstImage(i,j) =a*g_srcImage(i,j) + b

    for (int y = 0; y < s_image.rows; y++)
    {
        for (int x = 0; x < s_image.cols; x++)
        {
            for (int c = 0; c < 3; c++)
            {
                //0<=c_p<=200
                double t = ((s_image.at<Vec3b>(y, x)[c] - 127) / 225.00)*c_p*0.1;
                t_imag.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(s_image.at<Vec3b>(y, x)[c] * ((1.00 / (1.00 + exp(-t))) + 0.3) + b_value - 100);
                //int t = s_image.at<Vec3b>(y, x)[c];
                //t_imag.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(t * ((c_p*0.1 / (1.00 + exp(-t))) + 1));
            }
        }
    }
    imshow("窗口02", s_image);
    imshow("效果图窗口", t_imag);
}

三、背景相减实验:

1、相减得到图一,下半未很好显示,而后定义阈值后与(f_image(x,y)[c] - b_image(x,y)[c])比较,对RGB三通道分别赋值为0或255得到下图效果:
图一

图二(阈值=5)

图三(阈值=30)

图四(阈值=50)
2、调整改进算法,原理如下:

对于去除噪声点,可以考虑使用中指滤波,对椒盐噪声有较好效果

image.png

将像素点得RGB值看为一向量,求前景与背景三通道差值得平方和,最后取平方根后与阈值进行比较,大于阈值一并将三通道值都赋值为255,反之为0,最后效果如下:
50

75

100

150

可以看出当阈值为75-100时效果最好。

code
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include<math.h>
#include <iostream>

using namespace std;
using namespace cv;

int maind22(){
    Mat f_image, b_image;

    f_image = imread("123.png");
    b_image = imread("123b.png");

    //Mat gray_f;
    //cvtColor(f_image, gray_f, CV_BGR2GRAY);  //彩色图片转换成黑白图片



    if (!f_image.data||!b_image.data)
    {
        cout << "读取图片失败!" << endl;
        return -1;
    }

    if (f_image.rows != b_image.rows || f_image.cols != b_image.cols)
        cout << "前景图与后景图尺寸不符,无法相减!" << endl;

    Mat t_image = Mat::zeros(f_image.size(), f_image.type());

    namedWindow("<效果图窗口>", WINDOW_AUTOSIZE);

    double sum = 0.0;

    for (int y = 0; y < f_image.rows; y++)
    {
        for (int x = 0; x < f_image.cols; x++)
        {
            sum = 0.0;
            for (int c = 0; c < 3; c++)
            {
                sum += pow((f_image.at<Vec3b>(y, x)[c] - b_image.at<Vec3b>(y, x)[c]), 2);   
            }
            sum = sqrt(sum);
            if (sum >= 75) {
                for (int c = 0; c < 3; c++)
                {
                    t_image.at<Vec3b>(y, x)[c] = saturate_cast < uchar>(255);
                }
            }
            else {
                for (int c = 0; c < 3; c++)
                {
                    t_image.at<Vec3b>(y, x)[c] = saturate_cast < uchar>(0);
                }
            }               
        }
    }

    //cvtColor(t_image, t_image, CV_BGR2GRAY);
    imshow("<效果图窗口>", t_image);
    waitKey(0);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容