OpenCvSharp从入门到实践-(06)创建图像

目录

1、创建图像

1.1实例1-创建黑色图像

1.2实例2-创建白色图像

1.3实例3-创建随机像素的雪花点图像

2、图像拼接

2.1水平拼接图像

2.2垂直拼接图像

2.3实例4-垂直和水平两种方式拼接两张图像


在OpenCV中,黑白图像其实就是一个二维数组,彩色图像就是一个三位数组。数组中的每个元素就是图像中对应位置的像素值。

1、创建图像

在黑白图像中,像素值为0表示纯黑色,像素值为255表示纯白色

1.1实例1-创建黑色图像

创建一个100行、200列(即宽200、高100)的黑色图像,代码如下:

int width = 200;
int height = 100;
Mat img = Mat.Zeros(height, width, MatType.CV_8UC1);
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果

方式二,效果同上,代码如下:

int width = 200;
int height = 100;
int[] array = new int[200 * 100];
Mat img = new Mat(height, width, MatType.CV_8UC1, array);
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

1.2实例2-创建白色图像

创建白色图像有多种方式:

第一种:利用Mat构造函数直接创建;

第二种:利用Mat.Ones方法创建一个像素值为1的图像,然后将图像中所有像素值乘以255;

第三种:创建一个所有值都为255的数组,利用数组创建图像;

第四种:利用SetTo方法;

第一种代码如下:

int width = 200;
int height = 100;
Mat img = new Mat(new Size(width, height), MatType.CV_8UC1, Scalar.White);
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

第二种代码如下:

int width = 200;
int height = 100;
Mat img = Mat.Ones(height, width, MatType.CV_8UC1) * 255;
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

第三种代码如下:

int width = 200;
int height = 100;
byte[] array = new byte[width* height]; // 定义了长度为width* height的数组
for (int i = 0; i < array.Length; i++)
{
    array[i] = 255; // 将每个元素赋值为255
}
Mat img = new Mat(height, width, MatType.CV_8UC1, array);
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

第四种代码如下:

int width = 200;
int height = 100;
Mat img = new Mat(new Size(width, height), MatType.CV_8UC1);
img.SetTo(new Scalar(255, 255, 255)); // 将背景设置为白色
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果:

1.3实例3-创建随机像素的雪花点图像

代码如下:

int width = 200;
int height = 100;
Mat img = new Mat(height, width, MatType.CV_8UC1);
Random random = new Random();
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        byte blue = (byte)(random.NextDouble() * 256);
        byte green = (byte)(random.NextDouble() * 256);
        byte red = (byte)(random.NextDouble() * 256);
        Vec3b color = new Vec3b((byte)blue, (byte)green, (byte)red);
        img.At<Vec3b>(i, j) = color;
    }
}
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows(); 

效果:

 

改变一行代码,创建彩色的随机图像,代码如下:

int width = 200;
int height = 100;
Mat img = new Mat(height, width, MatType.CV_8UC3);
Random random = new Random();
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {
        byte blue = (byte)(random.NextDouble() * 256);
        byte green = (byte)(random.NextDouble() * 256);
        byte red = (byte)(random.NextDouble() * 256);
        Vec3b color = new Vec3b((byte)blue, (byte)green, (byte)red);
        img.At<Vec3b>(i, j) = color;
    }
}
Cv2.ImShow("img", img);
Cv2.WaitKey();
Cv2.DestroyAllWindows(); 

效果:

 

2、图像拼接

OpenCvSharp中提供Cv2.HConcat、Cv2.VConcat方法实现图像拼接。

2.1水平拼接图像

Cv2.HConcat方法可以对图像进行水平拼接(或者叫横向拼接),其函数如下:

public static void HConcat(IEnumerable<Mat> src, OutputArray dst)

说明:

摘要:
    Applies horizontal concatenation to given matrices.

参数:
  src:
    input array or vector of matrices. all of the matrices must have the same number
    of rows and the same depth.

  dst:
    output array. It has the same number of rows and depth as the src, and the sum
    of cols of the src.

2.2垂直拼接图像

Cv2.VConcat可以对图像进行垂直拼接(或者叫纵向拼接),其函数如下:

public static void VConcat(IEnumerable<Mat> src, OutputArray dst)

说明:

摘要:
    Applies vertical concatenation to given matrices.

参数:
  src:
    input array or vector of matrices. all of the matrices must have the same number
    of cols and the same depth.

  dst:
    output array. It has the same number of cols and depth as the src, and the sum
    of rows of the src.

2.3实例4-垂直和水平两种方式拼接两张图像

代码如下:

Mat mat = Cv2.ImRead("test01.jpg");
Cv2.ImShow("src", mat);

Mat dst = new Mat();
Cv2.VConcat(new Mat[] { mat, mat }, dst);
Cv2.ImShow("img_v", dst);

Cv2.HConcat(new Mat[] { mat, mat }, dst);
Cv2.ImShow("img_h", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果:

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

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

相关文章

[ Linux Audio 篇 ] 音频开发入门基础知识

在短视频兴起的背景下&#xff0c;音视频开发越来越受到重视。接下来将为大家介绍音频开发者入门知识&#xff0c;帮助读者快速了解这个领域。 轻柔的音乐、程序员有节奏感的键盘声、嗡嗡的发动机、刺耳的手提钻……这些声音是如何产生的呢&#xff1f;又是如何传到我们耳中的…

SpringSecurity和JWT实现认证和授权

SpringSecurity和JWT实现认证和授权 框架介绍SpringSecurityJWT组成实例JWT实现认证和授权的原理 Hutool 使用表整合SpringSecurity及JWT在pom.xml中添加依赖添加JWT token的工具类添加RbacAdminService&#xff1a;添加自定义mapper创建SpringSecurity配置类添加ProjectSecuri…

Redis--14--BigKey 和 热点Key

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 BigKey1.什么是bigkey2.bigkey的危害3.发现bigkeyscan 4.解决bigkey 什么是热点Key&#xff1f;该如何解决1. 产生原因和危害原因危害 2.发现热点key预估发现客户端…

使用RTOS时需要注意的几点内容

对许多嵌入式项目来说&#xff0c;系统设计师都倾向于选择实时操作系统(RTOS)。但RTOS总是必要的吗? 答案是取决于具体的应用&#xff0c;因此了解我们要达到什么目标是决定RTOS是必要的还是花瓶的关键。 一般来说&#xff0c;在采用非实时操作系统(non-RTOS)的任何场合&…

praseInt 和 逻辑或连用

这是做项目时遇到json文件转换 的一个小坑 将json 对象中的值 由字符串(数字字符串) 转换为 数值类型&#xff0c;如果是 转换失败 &#xff0c;就返回 -1 这里的 parseInt 看起来非常简洁&#xff0c;但是存在一个小坑 transformedData[fieldsToCheck[i]] parseInt(origina…

Stable Diffusion AI绘画系列【11】:超萌的Q版手办萌宠系列

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

C语言memcpy,memmove的介绍及模拟实现

文章目录 每日一言memcpy介绍模拟实现 memmove介绍模拟实现思路代码 结语 每日一言 If you want to lift yourself up, lift up someone else. 如果你想振奋自己&#xff0c; 先振奋周遭的人。 memcpy 介绍 函数原型&#xff1a; void *memcpy(void *dest, const void *sr…

送女朋友一个猜数字小游戏,猜对了会显示爱心(给你心爱的他或她一个惊喜)

起因是我在学习C语言完成老师布置C语言写一个猜数字的作业&#xff0c;突发奇想&#xff0c;能不能在这个猜对了之后弹出一个不一样的页面&#xff0c;然后就试试看能不能实现。基本思路是这样的&#xff1a; 1&#xff1a;先写一个C语言的猜数字的小游戏&#xff0c;在我上个文…

StackGres 1.6 数据库平台工程功能介绍以及快速上手

StackGres 1.6 数据库平台工程功能 声明式 K8S CRs StackGres operator 完全由 Kubernetes 自定义资源管理。除了 kubectl 或任何其他 Kubernetes API 访问之外&#xff0c;不需要安装任何客户端或其他工具来管理 StackGres。您的请求由 CRD 的 spec 部分表示&#xff0c;任何 …

Redis 数据结构详解

分类 编程技术 Redis 数据类型分为&#xff1a;字符串类型、散列类型、列表类型、集合类型、有序集合类型。 Redis 这么火&#xff0c;它运行有多块&#xff1f;一台普通的笔记本电脑&#xff0c;可以在1秒钟内完成十万次的读写操作。 原子操作&#xff1a;最小的操作单位&a…

无懈可击的身份验证:深入了解JWT的工作原理

&#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 无懈可击的身份验证&#xff1a;深入了解JWT的工作原理 前言JWT的基础概念基本概念JWT的工作流程注意事项 JWT的工作原理生成令牌传输令牌验证令牌 JWT的安全性考量1. 使用强…

MySql下载和安装

MySql下载和安装 一、概述 MySQL是一个开放源代码的关系型数据库管理系统 &#xff0c;由瑞典MySQL AB&#xff08;创始人Michael Widenius&#xff09;公 司1995年开发&#xff0c;迅速成为开源数据库的 No.1。 二、下载和安装 下载地址&#xff1a;https://dev.mysql.com…

Python编程技巧 – 迭代器(Iterator)

Python编程技巧 – 迭代器(Iterator) By JacksonML Iterator(迭代器)是Python语言的核心概念之一。它常常与装饰器和生成器一道被人们提及&#xff0c;也是所有Python书籍需要涉及的部分。 本文简要介绍迭代器的功能以及实际的案例&#xff0c;希望对广大读者和学生有所帮助。…

自然语言处理(NLP)技术-AI生成版

自然语言处理&#xff08;NLP&#xff09;是一种涵盖众多技术的交叉学科&#xff0c;旨在使计算机能够理解、生成和处理自然语言文本。它涉及语言学、计算机科学、统计学和人工智能等多个领域。下面将举例说明NLP技术在实际应用中的一些场景。 情感分析 情感分析是指使用NLP技…

Xshell会话文件解密获取密码

Xshell会话文件解密获取密码 开发了一个小工具用于获取已存储的xshell会话密码功能简介截图展示下载地址 开发了一个小工具用于获取已存储的xshell会话密码 在日常开发中&#xff0c;服务器太多&#xff0c;密码记不住。使用xshell管理服务器会话&#xff0c;记住密码&#xf…

Linux网络之连接跟踪 conntrack

一 Linux网络之连接跟踪 conntrack k8s 有关conntrack的分析 ① 什么是连接跟踪 netfilter连接跟踪 conntrack 详述 思考&#xff1a;连接跟踪模块会对哪些协议进行跟踪?TCP、UDP、ICMP、DCCP、SCTP、GRE ② 为什么需要连接跟踪 没有连接跟踪有很多问题是不好解决的&a…

WebGL笔记:js中矩阵库的使用

矩阵库 手写矩阵&#xff0c;其实很麻烦&#xff0c;可以将其模块化市面上已经有许多开源的矩阵库 比如《WebGL 编程指南》里的 cuon-matrix.jsthree.js 的 Matrix3 和 Matrix4 对象 three.js的 Matrix4 对象的用法 1 &#xff09;核心代码 1.引入Matrix4对象 import { Mat…

Spring一些基础问题整理

备注&#xff1a;针对基本问题做一些基本的总结&#xff0c;不是详细解答&#xff01; 1.Spring Boot与以前的Spring有什么区别&#xff1f; 具体可以见博客&#xff1a; 微服务架构具体实现工具框架&#xff1a;Spring Boot概览与核心原理 https://blog.csdn.net/xiaofeng103…

牛客在线编程(SQL大厂面试真题)

1.各个视频的平均完播率_牛客题霸_牛客网 ROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start_time d…

最大乘积分解(动态规划)

相较于我上一题写的动态规划&#xff0c;这一题比较简单 代码如下&#xff1a; #include<stdio.h>int main(void) {long long n, max[101] {0, 1};scanf("%lld", &n);for(int i 1; i < n; i)max[i] i;for(int i 1; i < n; i)for(int j 1; j &…