Aprendizaje OpenCV: operación básica de imagen (3): ajuste de contraste y brillo, fusión de imagen

Contraste y brillo de la imagen

En la fórmula de píxeles de la imagen g (x) = a * f (x) + b:

  • El parámetro f (x) representa el píxel de la imagen de origen.
  • El parámetro g (x) representa el píxel de la imagen de salida.
  • El parámetro a (necesidad de satisfacer a> 0) se llama ganancia y se usa a menudo para controlar el contraste de la imagen.
  • El parámetro b generalmente se llama sesgo y se usa a menudo para controlar el brillo de la imagen.

Fusión de imágenes

Importancia: asocie la información en varias imágenes para que una sola imagen contenga más elementos de información para facilitar el control y el procesamiento posteriores.

Método: basado en el aprendizaje profundo: use la generación de redes GAN, use la generación de redes de códecs, use la tecnología de fusión de mapas de características, etc.

           Basado en el procesamiento de imágenes: cálculo del valor de píxeles, costura RANSAC, etc.

Este artículo presenta principalmente el método basado en píxeles. La idea más intuitiva es asociar los píxeles de la imagen fusionada con los valores de píxeles de las dos imágenes . La forma más sencilla es realizar cálculos sobre los valores de píxeles de las dos imágenes, como multiplicar, sumar, etc. .

Introducción a la API

addWeighted (src1, alpha, src2, beta, gamma, dst) implementa las siguientes operaciones a nivel de píxel:

D(x,y) =S_1(x,y)*\alpha +S_2(x,y)*\beta +\gamma

Además, existen operaciones comunes add, mutiply, sub, etc .;

agregar (src1, src2, dst, máscara, tipo_datos)

Entre ellos, la máscara es el área donde se realiza la operación.

Práctica del código

Contraste y brillo

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



using namespace cv;

static void ContrastAndBright(int, void*);

int g_nContrastValue; //对比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage, g_dstImage;


int main()

{

	//读入用户提供的图像

	g_srcImage = imread("src.jpg");
	if (!g_srcImage.data) { printf("读取图片失败!\n"); return false
	g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());



	//设定对比度和亮度的初值
	g_nContrastValue = 80;
	g_nBrightValue = 80;



	//创建窗口
	namedWindow("结果", 1);



	//创建轨迹条
	createTrackbar("对比度:", "结果", &g_nContrastValue, 300, ContrastAndBright);
	createTrackbar("亮   度:", "结果", &g_nBrightValue, 200, ContrastAndBright);



	//调用回调函数

	ContrastAndBright(g_nContrastValue, 0);
	ContrastAndBright(g_nBrightValue, 0);



	//按下“q”键时,程序
	while (char(waitKey(1)) != 'q') {}
	return 0;

}


static void ContrastAndBright(int, void*)
{



	//创建窗口

	namedWindow("原图", 1);



	//三个for循环,依次遍历行、列、通道,执行运算 g_dstImage(i,j) =a*g_srcImage(i,j) + b

	for (int y = 0; y < g_srcImage.rows; y++)
	{
		for (int x = 0; x < g_srcImage.cols; x++)
		{ 
			for (int c = 0; c < 3; c++)
			{
				g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue * 0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
			}
		}
	}



	//显示图像
	imshow("原图", g_srcImage);
	imshow("结果", g_dstImage);

}

Fusión de imágenes

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
int main(int argc, char* argv[])
{

	Mat src = imread("src.jpg");
	if (src.empty())
	{
		cout << "could not open image ..." << endl;
		return -1;
	}

	Mat back = imread("back.jpg");
	if (!back.data) //用data来判断MAT是否为空
	{
		cout << "could not open image ..." << endl;
		return -1;
	}

	resize(back, back, src.size());
	

	float alpha = 0.5;

	Mat dst ;
	if (src.size() == back.size() && src.type() == back.type())
	{
		addWeighted(src, alpha, back, 0.3, 10.0, dst);	
		//add(src, back, dst);
		//multiply(src, back, dst);
		imwrite("add.jpg", dst);
	}
	return 0;
}

                                              Multiplica sumar

                                               Adición de peso

Supongo que te gusta

Origin blog.csdn.net/fan1102958151/article/details/106965381
Recomendado
Clasificación