Resumo do método de combinação linear de sobreposição de imagem OpenCV C ++


// Sistema operacional: Windows 10 64 bits
// Linguagem de desenvolvimento: C ++
// Versão IDE: Visual Studio 2019
// Versão OpenCV: 4.20

1. Use o ROI da região de interesse para obter sobreposição de imagem

ROI (região de interesse), região de interesse. Na visão de máquina e no processamento de imagens, a área a ser processada é delineada na forma de caixas, círculos, elipses, polígonos irregulares, etc. da imagem processada, que é chamada de região de interesse, ROI. Vários operadores e funções são comumente usados ​​em software de visão de máquina, como Halcon, OpenCV e Matlab para obter o ROI da região de interesse e executar a próxima etapa do processamento da imagem.

1 Criar área ROI

// 定义一个Mat类型,用于存放,图像的ROI
	Mat imageROI;
	//方法一
	imageROI= image(Rect(800,350,logo.cols,logo.rows));
	//方法二
	//imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));

// Isso é equivalente a usar o conhecimento do ponteiro para apontar a área roi para a área correspondente da imagem da imagem
Rect (x, y, w, h)
x, y são as coordenadas do canto superior esquerdo da área ROI de A imagem; as coordenadas do canto superior esquerdo da imagem (0, 0)

x + logo.cols não podem ser maiores que a largura do objeto de imagem imagem
y + logo.rows não podem ser maiores que a altura da imagem imagem do objeto

2 Construindo máscara de área ROI (básico de sobreposição de imagem)

Mat ROI = image(Rect(200, 250, logo.cols, logo.rows));
Mat mask = imread("logo.jpg", 0);//掩膜必须为叠加图片的灰度图
logo.copyTo(ROI, mask);

3 Implementação e efeito do código

O seguinte mostra como usar ROI para adicionar uma imagem à posição especificada de outra imagem

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main()
{
        //【1】读入图像  
        Mat srcImage1 = imread("49.jpg");
        Mat logoImage = imread("61.jpg");
       
        //显示原图
        namedWindow("【1】原图");
        imshow("【1】原图", srcImage1);
        namedWindow("【2】原图");
        imshow("【2】logo", logoImage);

        //【2】定义一个Mat类型并给其设定ROI区域  
        Mat imageROI = srcImage1(Rect(320, 120, logoImage.cols, logoImage.rows));

        //【3】加载掩模(必须是灰度图)  
        Mat mask = imread("61.jpg", 0);

        //【4】将掩膜拷贝到ROI  
        logoImage.copyTo(imageROI, mask);

        //【5】显示结果  
        namedWindow("【3】ROI图像叠加");
        imshow("【3】ROI图像叠加", srcImage1);

        waitKey();
	return 0;
}

Esta função carrega primeiro duas imagens jpg em srcImage1 e logoImage, então define um imageROI do tipo Mat e usa cv :: Rect para definir sua região de interesse para uma região em srcImage1 e associar imageROI a srcImage1. Em seguida, defina uma máscara do tipo Mat e leia em dota_logo.jpg, use Mat :: copyTo para copiar o conteúdo da máscara para o imageROI, e então obtenha as renderizações finais, namedWindow e imshow são usados ​​juntos para mostrar o resultado final.

Imagem 1 e Imagem 2 Imagem original
Insira a descrição da imagem aquiInsira a descrição da imagem aqui
Abaixo está o efeito de sobreposição
Insira a descrição da imagem aqui

2. A função addWeighted realiza a combinação linear de imagens

Mixagem linear significa que duas fotos ou dois vídeos são sobrepostos e apresentados em uma determinada relação funcional.

Para as duas imagens de entrada A e B, pegue os valores de pixel na mesma posição e adicione-os linearmente e, em seguida, atribua o resultado ao pixel na mesma posição na imagem de destino. O parâmetro α controla o peso das duas imagens na imagem alvo.

                              g(x)=αA(x)+(1−α)B(x)

Qual é o efeito da combinação linear de imagens? Na virada de página da apresentação de slides ou na produção de filmes, geralmente é necessário produzir o efeito de sobreposição da tela. Na fórmula acima, desde que α seja gradualmente reduzido de 1 para 0, o efeito de sobreposição ao fazer a transição da imagem I0 para a imagem I1 pode ser produzido.

OpenCV fornece uma API para combinação linear de duas imagens. A fórmula de cálculo na qual a API se baseia é a seguinte:

                     dst = src1[i] * α + src2[i] * β + γ;

função original addWeighted

void addWeighted (InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1); **

O primeiro parâmetro: a primeira imagem a ser sobreposta Mat

O segundo parâmetro: Identifica o peso da sobreposição do primeiro parâmetro

O terceiro parâmetro: representa a segunda imagem sobreposta, deve ter o mesmo tamanho e número de canais da primeira matriz

O quarto parâmetro: representa o peso da segunda imagem sobreposta

O quinto parâmetro: o parâmetro de saída, que precisa ter o mesmo número de canais e tamanho que as duas primeiras imagens

O sexto parâmetro: um valor escalar adicionado ao peso total (preencha 0 muito bem)

O sétimo parâmetro: a profundidade da matriz de saída tem um valor padrão de -1, quando as duas imagens sobrepostas têm a mesma profundidade, o parâmetro é -1

// 将logo加到原图上
//【3】将logo加到原图上,利用线性混合构建掩膜,其中logo权重是0.3,原图中的ROI区域图像是0.5
   addWeighted(imageROI, 0.5, logo, 0.5,0, imageROI);

Vale ressaltar que o
tamanho e o tipo das duas imagens devem ser iguais.Se as duas imagens forem inconsistentes, use primeiro a ROI para extrair a imagem menor e depois sobrepô-la. Embora não seja obrigatório que os dois pesos devam somar 1, normalmente é assim tão seco.

Código

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main()
{
    //【0】定义一些局部变量  
    double α = 0.4;
    double β;
    Mat srcImage2, srcImage3, dstImage;

    //【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )  
    srcImage2 = imread("67.jpg");
    srcImage3 = imread("68.jpg");

    //【2】做图像混合加权操作  
    β = (1.0 - α);
    addWeighted(srcImage2, α, srcImage3, β, 0., dstImage);

    //【3】创建并显示 
    namedWindow("<1>原图");
    imshow("<1>原图", srcImage2);
    namedWindow("<2>原图");
    imshow("<2>原图", srcImage3);

    namedWindow("<3>线性混合效果图");
    imshow("<3>线性混合示效果图", dstImage);

    waitKey();
	return 0;
}

Foto 1 e Foto 2 Foto original ( duas fotos devem ser do mesmo tamanho)
aqui está uma imagem da captura de tela, o tamanho pode ser diferente, não rodará

Se você baixar menos de duas imagens idênticas, pode consultar este link para alterar qualquer tamanho
https://blog.csdn.net/m0_51233386/article/details/112393204 .
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Figura 3 renderizações
Insira a descrição da imagem aqui

Três, ROI e addWeighted combinados com operação de combinação de imagens

ROI (região de interesse) região de interesse, no processo de processamento de imagem, às vezes queremos processar certas regiões na imagem, ou seja, apenas interessados ​​em certas regiões, então ROI e função addWeighted são usados ​​em combinação. Especifique a área para realizar operações de mesclagem de imagens.

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main()
{
	//-----------------------------------【一、初级图像混合】--------------------------------------
	//	描述:二、初级图像混合
	//--------------------------------------------------------------------------------------------------
	//载入图片
	Mat image = imread("49.jpg");
	Mat logo = imread("61.jpg");

	// 定义一个Mat类型,用于存放,图像的ROI
	Mat imageROI;
	//方法一
	imageROI = image(Rect(300, 80, logo.cols, logo.rows));
	//方法二
	//imageROI= image(Range(320,320+logo.rows),Range(120,120+logo.cols));

	// 将logo加到原图上
	//【3】将logo加到原图上  ,利用线性混合构建掩膜,其中logo权重是0.8,原图中的ROI区域图像是0.2
	addWeighted(imageROI, 1, logo, 0.5, 0, imageROI);

	//显示结果
	namedWindow("【3】49");
	imshow("【3】49+61", image);

	//-----------------------------------【二、图像的输出】--------------------------------------
	//	描述:将一个Mat图像输出到图像文件
	//-----------------------------------------------------------------------------------------------
	//输出一张jpg图片到工程目录下
	imwrite("由imwrite生成的图片.jpg", image);

	waitKey();

	return 0;
}

A seguir está o efeito de sobreposição

Com base neste método e método um método de sobreposição de ROI, o peso da sobreposição de imagem é adicionado
Insira a descrição da imagem aqui

Quatro, adição direta (não linear)

函数为 add()
示例:add(src1, src2, dst_add);

Implementação e efeito do código

#include <opencv2 / core / core.hpp>
#include <opencv2 / highgui / highgui.hpp>
usando o namespace cv;

int Add () { Mat src1, src2, dst_add;

add(src1, src2, dst_add);
//叠加函数图像的函数
imshow("src1", src1);
imshow("src2", src2);
imshow("dst_add", dst_add);
waitKey();

return 0;

}

int main ()
{ Add (); // Sobreposição de imagem

return 0;

}
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Efeito de sobreposição
Insira a descrição da imagem aqui
// método de leitura na imagem

// Método um de leitura na imagem

src1 = imread("67.jpg");
src2 = imread("68.jpg");

// Método dois de leitura na imagem

const char* filename1 = "67.jpg";
const char* filename2 = "68.jpg";

imread(filename1).copyTo(src1);
if (src1.empty()) {
    throw("Faild open file.");
}
imread(filename2).copyTo(src2);
if (src2.empty()) {
    throw("Faild open file.");
}

Acho que você gosta

Origin blog.csdn.net/m0_51233386/article/details/113829240
Recomendado
Clasificación