图像像素的线性叠加(第四天)

2024-05-28 20:18

本文主要是介绍图像像素的线性叠加(第四天),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理论说明:

上节博文说到对图像的像素进行操作,是基于一幅图像的每个像素。

这节博文所说的是对于多幅图像进行操作,就像PS里面的“蒙板”一样->当两幅图像进行混合的时候可以建立一个蒙版然后对蒙版调整对比度和透明度什么的,然后进行合成。

其中 的取值范围为0~1之间

这是线性叠加的理论基础,就是一个加权平均而已。

易错点说明:

 首先说一下API函数:Mat.convertTo()函数

假如我的原图读取时CV_8UC3,但是我想对图像的像素进行操作,uchar类型的精度不准确,所以就比比转换类型了,转换成CV_32FC3。
刚开始看书看见converto可以转化类型,就自己试了。但是用imshow显示//不出来。
input_image1.convertTo(input_image1, CV_32FC3);

在知乎上看到一个回答说opencv手册只是转化类型了,比如你想把1—10的数字5转化成10.00—100.00数字50.00,converto是转化了,但是imshow()显示是0-255的RGB颜色空间

所以就需要我们想用imshow显示的时候需要把50.00转化成5.00显示,这种转化是有意义的,1-10才10个数,1.00-10.00,很多很多数了,达成了我们目的:高精度的要求。

input_image1.convertTo(input_image1, CV_32FC3, 1 / 255.0);//所以需要转化成0-255区显示

下面是opencv函数手册的说明:

 1 /** @brief Converts an array to another data type with optional scaling.2 3     The method converts source pixel values to the target data type. saturate_cast\<\> is applied at4     the end to avoid possible overflows:5 6     \f[m(x,y) = saturate \_ cast<rType>( \alpha (*this)(x,y) +  \beta )\f]7     @param m output matrix; if it does not have a proper size or type before the operation, it is8     reallocated.9     @param rtype desired output matrix type or, rather, the depth since the number of channels are the
10     same as the input has; if rtype is negative, the output matrix will have the same type as the input.
11     @param alpha optional scale factor.
12     @param beta optional delta added to the scaled values.
13      */
1  If the image is 8-bit unsigned, it is displayed as is.
2 -   If the image is 16-bit unsigned or 32-bit integer, the pixels are divided by 256. That is, the
3     value range [0,255\*256] is mapped to [0,255].
4 -   If the image is 32-bit floating-point, the pixel values are multiplied by 255. That is, the
5     value range [0,1] is mapped to [0,255].

 手写API程序:用的是迭代器,当然可以用其它的方法:

 1 #include<iostream>2 #include <opencv2/opencv.hpp>3 #include <math.h>4 using namespace cv;5 using namespace std;6 7 int main(int argc,char**argv)8 {9     Mat input_image1 = imread("1.jpg");
10     Mat input_image2 = imread("2.jpg");    
11     input_image1.convertTo(input_image1, CV_32FC3, 1 / 255.0);
12     input_image2.convertTo(input_image2, CV_32FC3, 1 / 255.0);
13     if (input_image1.data==NULL||input_image2.data==NULL) {
14         return -1; cout << "can't open image.../";
15     }
16     imshow("Sourse image1", input_image1);
17     imshow("Source image2", input_image2);
18     CV_Assert(input_image1.rows == input_image2.rows&&input_image1.cols == input_image2.cols);
19     int Width = input_image1.rows;
20     int length = input_image2.rows;
21     Mat output_image;
22     output_image.create(input_image1.size(), input_image1.type());
23     Mat_<Vec3f>::iterator it1 = input_image1.begin<Vec3f>();
24     Mat_<Vec3f>::iterator it2 = input_image2.begin<Vec3f>();
25     Mat_<Vec3f>::iterator out = output_image.begin<Vec3f>();
26     while (it1 != input_image1.end<Vec3b>())
27     {
28         //---只是初学测试函数,当然可以封装成API一样的函数----//
29         (*out)[0] = 0.5*((*it1)[0]) + 0.5*((*it2)[0]) + 0;
30         (*out)[1] = 0.5*((*it1)[1]) + 0.5*((*it2)[1]) + 0;
31         (*out)[2] = 0.5*((*it1)[2]) + 0.5*((*it2)[2]) + 0;
32         it1++;
33         it2++;
34         out++;
35     }
37     imshow("Destinate image",output_image);
38     waitKey(0);
39     return 0;
40 }

opencv自带API函数:

 1 int main(int argc,char**argv)2 {3     Mat input_image1 = imread("1.jpg");4     Mat input_image2 = imread("2.jpg");    5     //input_image1.convertTo(input_image1, CV_32FC3, 1 / 255.0);6     //input_image2.convertTo(input_image2, CV_32FC3, 1 / 255.0);7     if (input_image1.data==NULL||input_image2.data==NULL) {8         return -1; cout << "can't open image.../";9     }
10     imshow("Sourse image1", input_image1);
11     imshow("Source image2", input_image2);
12     CV_Assert(input_image1.rows == input_image2.rows&&input_image1.cols == input_image2.cols);
13     Mat output_image;
14 addWeighted(input_image1,0.5,input_image2,0.5,0,output_image,-1);
15     add(input_image1,);
16     imshow("Destinate image",output_image);
17     waitKey(0);
18     return 0;
19 }

图片显示:

对于我们这种小白来说,找两张相同像素和尺寸的图片很难:有一篇肖博文帮助 http://www.cnblogs.com/wjy-lulu/p/6644901.html

扩展函数:还有一些线性函数的操作,比如:乘法,除法,减法等等

这些都比较简单,手写也是几行代码而已。

Add():像素加法函数

multiply():像素乘法函数

这里就不加说明和演示了。。。

这篇关于图像像素的线性叠加(第四天)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011581

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

【高等代数笔记】线性空间(一到四)

3. 线性空间 令 K n : = { ( a 1 , a 2 , . . . , a n ) ∣ a i ∈ K , i = 1 , 2 , . . . , n } \textbf{K}^{n}:=\{(a_{1},a_{2},...,a_{n})|a_{i}\in\textbf{K},i=1,2,...,n\} Kn:={(a1​,a2​,...,an​)∣ai​∈K,i=1,2,...,n

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正