当前位置: 首页 > article >正文

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.kler.cn/news/155680.html

相关文章:

  • 编译原理头歌实验:实验4《算符优先分析法设计与实现》(C语言版)
  • vue el-select封装及使用
  • Prefix-Tuning 论文概述
  • JAVA代码优化:记录日志
  • 使用AOS实现网页动画效果
  • 利用段落检索和生成模型进行开放域问答12.2
  • Spring Initial 脚手架国内镜像地址
  • C/C++学生选课/排课系统[2023-12-3]
  • 保育员个人简历精选7篇
  • C++笔试训练day_1
  • Linux网络之连接跟踪 conntrack
  • gitlab 代码提交账户信息修改
  • “大型”基础模型中幻觉的调查
  • 工程数学笔记 | 傅里叶级数/变换的本质理解
  • 1949-2021年全国31省铁路里程数据
  • Java数据结构之《构造哈夫曼树》题目
  • 项目设计---网页五子棋
  • ArrayList 与 顺序表 (附洗牌算法)!
  • 软件设计模式原则(三)单一职责原则
  • SpringSecurity和JWT实现认证和授权
  • wvp gb28181 pro 平台国标级连功能说明
  • SSM框架(五):Maven进阶
  • SpringMVC基础
  • 「Linux」进程等待与替换
  • Linux 上的容器技术
  • Linux服务器初次使用需要的环境配置
  • LASSO vs GridSearchCV
  • 12.03 二叉树简单题2
  • LeetCode刷题---路径问题
  • Hdoop学习笔记(HDP)-Part.08 部署Ambari集群