05- OpenCV:图像操作和图像混合

news2024/12/23 17:34:34

目录

一、图像操作

1、读写图像

2、读写像素

3、修改像素值

4、Vec3b与Vec3F

5、相关的代码演示

二、图像混合

1、理论-线性混合操作

2、相关API(addWeighted)

3、代码演示(完整的例子)


一、图像操作

1、读写图像

(1)imread 可以指定加载为灰度或者RGB图像

(2)Imwrite 保存图像文件,类型由扩展名决定

2、读写像素

(1)读一个GRAY像素点的像素值(CV_8UC1)

Scalar intensity = img.at<uchar>(y, x);
或者 
Scalar intensity = img.at<uchar>(Point(x, y)); 

(2)读一个RGB像素点的像素值

Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
3、修改像素值

(1)灰度图像

 img.at<uchar>(y, x) = 128;

(2)RGB三通道图像

img.at<Vec3b>(y,x)[0]=128; // blue 
img.at<Vec3b>(y,x)[1]=128; // green 
img.at<Vec3b>(y,x)[2]=128; // red

(3)空白图像赋值

img = Scalar(0);

(4)ROI选择

Rect r(10, 10, 100, 100); 
Mat smallImg = img(r);
4、Vec3b与Vec3F

(1)Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。

(2)Vec3f对应三通道的float类型数据

(3)把CV_8UC1转换到CV32F1实现如下:

src.convertTo(dst, CV_32F);
5、相关的代码演示
#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main(int argc, char** args) {
	Mat image = imread("D:/test.jpg", IMREAD_COLOR);
	if (image.empty()) {
		cout << "could not find the image resource..." << std::endl;
		return -1;
	}

	Mat grayImg;
	cvtColor(image, grayImg, COLOR_BGR2GRAY);
	Mat sobelx; 
	Sobel(grayImg, sobelx, CV_32F, 1, 0);
	double minVal, maxVal;
	minMaxLoc(sobelx, &minVal, &maxVal); //find minimum and maximum intensities
	Mat draw;
	sobelx.convertTo(draw, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));
	/*
	int height = image.rows;
	int width = image.cols;
	int channels = image.channels();
	printf("height=%d width=%d channels=%d", height, width, channels);
	for (int row = 0; row < height; row++) {
		for (int col = 0; col < width; col++) {
			if (channels == 3) {
				image.at<Vec3b>(row, col)[0] = 0; // blue
				image.at<Vec3b>(row, col)[1] = 0; // green
			}
		}
	}
	*/
	namedWindow("My Image", CV_WINDOW_AUTOSIZE);
	imshow("My Image", draw);
	waitKey(0);
	return 0;
}

效果展示:

bitwise_not()这接口使用:逐位取反

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

using namespace cv;

int main()
{
	Mat src, dst;
	src = imread("test.jpg");
	if (!src.data)
	{
		printf("could not load image...\n");
	}

	namedWindow("input image", CV_WINDOW_AUTOSIZE);
	imshow("input image", src);

    // 单通道的Mat
	Mat gray_src;
	cvtColor(src, gray_src, COLOR_RGB2GRAY);// 颜色空间的转换
	int nc = src.channels();

    // 图像像素操作,取反后,看输出是什么样子
	for (int row = 0; row < src.rows; row++)
	{
		for (int col = 0; col < src.cols; col++)
		{
			if (nc == 1)
			{
				int gray = gray_src.at<uchar>(row, col);
				gray_src.at<uchar>(row, col) = 255 - gray;
			}
			else if (nc == 3)
			{
				int b = src.at<Vec3b>(row, col)[0];
				int g = src.at<Vec3b>(row, col)[1];
				int r = src.at<Vec3b>(row, col)[2];
				dst.at<Vec3b>(row, col)[0] = 255 - b;
				dst.at<Vec3b>(row, col)[1] = 255 - g;
				dst.at<Vec3b>(row, col)[2] = 255 - r;
                
                //取最大值为灰度像素值
        	    //gray_src.at<uchar>(row, col) = max(r, max(b, g));
            
                //取最小值为灰度像素值
				//gray_src.at<uchar>(row, col) = min(r, min(b, g));
			}
		}
	}
    // 最后一个if的操作,就是3色通道的rgb都取反,可以用下面的接口代替
    //bitwise_not(src, dst);//能实现一样的效果

	namedWindow("mask_result", CV_WINDOW_AUTOSIZE);
	imshow("mask_result", dst);

	//imshow("mask_result", gray_src); //输出灰色图像

	waitKey(0);
	return 0;
    
}

运行代码得出最后的效果:

二、图像混合

1、理论-线性混合操作

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

2、相关API(addWeighted)

addWeighted 是OpenCV中的一个函数,用于对两个图像进行加权相加。它可以用于图像融合、图像混合以及图像叠加等应用。

函数原型如下:


void cv::addWeighted(
    InputArray src1,
    double alpha,
    InputArray src2,
    double beta,
    double gamma,
    OutputArray dst,
    int dtype = -1

)

参数说明:

  • src1:第一个输入图像。
  • alpha:第一个输入图像的权重。
  • src2:第二个输入图像。
  • beta:第二个输入图像的权重。
  • gamma:加到结果上的标量值。
  • dst:输出图像,与输入图像具有相同的尺寸和类型。
  • dtype:可选参数,指定输出图像的数据类型,默认为-1,表示与输入图像保持一致。

关键代码实现


cv::Mat image1 = cv::imread("image1.jpg");
cv::Mat image2 = cv::imread("image2.jpg");

cv::Mat blendedImage;
double alpha = 0.5;  // 第一个图像的权重

double beta = 0.5;   // 第二个图像的权重

double gamma = 0.0;  // 加到结果上的标量值


cv::addWeighted(image1, alpha, image2, beta, gamma, blendedImage);

cv::imshow("Blended Image", blendedImage);
cv::waitKey(0);

代码将加载两张图像,然后用 addWeighted 函数将它们进行加权相加,并将结果显示在窗口中。

你可以根据实际需求调整 alphabetagamma 的值,以及选择不同的图像作为输入来实现不同的效果。

3、代码演示(完整的例子)
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
	Mat src1, src2, dst;
	src1 = imread("D:/vcprojects/images/LinuxLogo.jpg");
	src2 = imread("D:/vcprojects/images/win7logo.jpg");
	if (!src1.data) {
		cout << "could not load image Linux Logo..." << endl;
		return -1;
	}
	if (!src2.data) {
		cout << "could not load image WIN7 Logo..." << endl;
		return -1;
	}

	double alpha = 0.5;
	if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {
		// addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
		// multiply(src1, src2, dst, 1.0);
		
		imshow("linuxlogo", src1);
		imshow("win7logo", src2);
		namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
		imshow("blend demo", dst);
	}
	else {
		printf("could not blend images , the size of images is not same...\n");
		return -1;
	}

	waitKey(0);
	return 0;
}

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1374293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 公众号开发,调用jssdk封装

vue 公众号开发&#xff0c;经常会使用到 转发朋友&#xff0c;朋友圈&#xff0c;调用扫一扫等功能&#xff0c;这时就要使用微信的 jssdk 微信jssdk传送门 1. 安装jssdk 插件 (jweixin-module) npm install jweixin-module --save 2. 封装方法 utils/jwx.js let jweixin…

【好书推荐】驾驭科技浪潮的新型人才,要学点心理学

“2023年&#xff0c;是疯狂的一年&#xff0c;是世界终于开始认真对待AI的一年。” Sam Altman在社交平台写到。 回顾今年&#xff0c;年初Chat GPT横空出圈&#xff0c;其超强的理解能力、深度学习能力、人机对话的流畅性和智能度&#xff0c;让世界为之折服。 很快&#…

消息开始事件message start event

一&#xff1a;bpmn 二&#xff1a;java repositoryService.createDeployment().name("消息事件流程").addClasspathResource("bpmn/msg_event_process.bpmn").deploy(); identityService.setAuthenticatedUserId("huihui"); ProcessInstance p…

转专业(UPC练习)

题目描述 根据教育部的规定&#xff0c;大学生进校后符合条件的可申请转专业。在校本科生在完成大学一年级课程&#xff0c;进入二年级之前&#xff0c;符合以下条件之一者&#xff0c;可以申请转专业&#xff1a;&#xff08;1&#xff09;在某一学科方面确有特长的学生&#…

通义千问Qwen-72B-Chat基于PAI的低代码微调部署实践

作者&#xff1a;熊兮、求伯、一耘 引言 通义千问-72B&#xff08;Qwen-72B&#xff09;是阿里云研发的通义千问大模型系列的720亿参数规模模型。Qwen-72B的预训练数据类型多样、覆盖广泛&#xff0c;包括大量网络文本、专业书籍、代码等。Qwen-72B-Chat是在Qwen-72B的基础上…

three.js 关键帧动画

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

【架构】API接口安全防护救命的11招

前言 如何保证接口的安全性? 根据多年的工作经验,给大家介绍一下保证接口安全的一些小技巧,希望对你会有所帮助。 1 参数校验 保证接口安全的第一步,也是最重要的一步,需要对接口的请求参数做校验。 如果我们把接口请求参数的校验做好了,真的可以拦截大部分的无效请求…

使用paho.mqtt.embedded-c和openssl实现MQTT的单向认证功能

1、背景 由于项目有需求在一个现有的产品上增加MQTT通信的功能&#xff0c;且出于安全考虑&#xff0c;MQTT要走TLS&#xff0c;采用单向认证的方式。 2、方案选择 由于是在现有的产品上新增功能&#xff0c;那么为了减少总的成本&#xff0c;故选择只动应用软件的来实现需求。…

设置若依Token过期时间

方法一&#xff1a;设置永不过期&#xff0c;有安全隐患&#xff0c;不建议使用 redisCache.setCacheObject(userKey, loginUser); 方法二&#xff1a;修改application.yml

Flutter组件GridView使用介绍

介绍 GridView 是 Flutter 中用于创建网格布局的滚动小部件。它可以创建多列布局&#xff0c;并且每个网格单元可以包含一个小部件。 GridView 提供了几种构造函数来创建不同类型的网格布局&#xff1a; GridView&#xff1a;最通用的构造函数&#xff0c;完全自定义网格布局…

vs报错TypeError: Cannot read property ‘parseComponent‘ of undefined(已解决)

目录 错误分析&#xff1a; 解决方案&#xff1a; 1.卸载 vue-template-compiler&#xff1a; 2.查看项目中已经安装的 Vue 的版本。 3.安装特定版本的 vue-template-compiler&#xff1a; 4.现在重新运行一下&#xff0c;成功&#xff01; 错误分析&#xff1a; 这是因…

练习接口测试第一步骤

最近一段时间学了Python语言&#xff0c;重新学了 Java&#xff0c;js&#xff0c;html语言&#xff0c;CSS&#xff0c;linux&#xff0c;一堆测试工具&#xff1b;唉&#xff5e; 在接触接口测试过程中补了很多课&#xff0c; 终于有点领悟接口测试的根本&#xff1b; 偶是…

在ubuntu上检查内存使用情况的九种方法

在 Ubuntu 中&#xff0c;可以通过 GUI(图形用户界面)和命令行使用多种方法来监视系统的内存使用情况&#xff0c;监视 Ubuntu 服务器上的内存使用情况并不复杂&#xff1b;了解已使用和可用的内存量对于故障排除和优化服务器性能至关重要&#xff0c;因为内存对系统 I/O 速度至…

008-关于FPGA/ZYNQ直接处理图像传感器数据输出的若干笔记(裸板采集思路)

文章目录 前言一、图像传感器厂商二、图像传感器的参数解析三、图像传感器中的全局曝光和卷帘曝光四、处理传感器图像数据流程1.研究当前图像传感器输出格式2.FPGA处理图像数据 总结 前言 最近也是未来需要考虑做的一件事情是&#xff0c;如何通过FPGA/ZYNQ去做显微镜图像观测…

VUE2/3:element ui table表格的显隐列(若依框架)

若依框架自带一个组件&#xff0c;封装了关于表格&#xff0c;展示和隐藏表格列的功能&#xff1b; 使用效果就是这样的&#xff0c;在表格上面&#xff0c;三个框&#xff0c;从左到右分别是隐藏上面搜索&#xff0c;刷新列表&#xff0c;和显隐列的功能&#xff1b; 一、下面…

基于 Spring Boot 支付宝沙箱支付(Java 版本)

基于 Spring Boot 支付宝沙箱支付&#xff08;Java 版本&#xff09; 步骤第一步&#xff1a;使用支付宝账户登录&#xff0c;打开控制台&#xff0c;进入沙箱环境第二步&#xff1a;配置内网穿透账号第三步&#xff1a;引入支付宝 SDK第四步&#xff1a; 配置 SpringBoot第五步…

【elastic search】JAVA操作elastic search

目录 1.环境准备 2.ES JAVA API 3.Spring Boot操作ES 1.环境准备 本文是作者ES系列的第三篇文章&#xff0c;关于ES的核心概念移步&#xff1a; https://bugman.blog.csdn.net/article/details/135342256?spm1001.2014.3001.5502 关于ES的下载安装教程以及基本使用&…

探秘人工智能大会:揭示未来技术发展趋势与学习之道

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的方方面面。 参加人工智能大会&#xff0c;不仅能够洞察到最前沿的技术动态&#xff0c;还能与业界专家、学者交流思想&#xff0c;共同探讨AI的未来发展。本文将带您探秘人工智能大…

SAP一次查看多张凭证明细SQ03

1、在SAP中通过FB03可以查看所有的凭证清单&#xff0c;但是如果想一次性查看多张凭证的行项目明细&#xff0c;通过SAP的查询功能SQ03来查询 首先&#xff0c;通过SQ03&#xff0c;给用户组&#xff0c;输入“/SAPQUERY/GL”&#xff0c;回车 2、通过SQ02&#xff0c;菜单栏的…