【OpenCV 基础知识 2】灰度化图片

cvCreateImage

使用OpenCV库在Delphi中创建一个灰度图像。让我解释一下:

gray_image := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  1. cvGetSize(image): 这个函数返回给定图像(在这里是image)的大小。它返回一个CvSize类型的结构体,包含图像的宽度和高度。
  2. IPL_DEPTH_8U: 这是图像的深度(bit-depth)参数。在这里,IPL_DEPTH_8U 表示8位无符号整数,即每个像素的灰度级别范围在0到255之间。
  3. 1: 这是通道数。在这里,1 表示创建一个单通道的灰度图像。
  4. cvCreateImage: 这是OpenCV库中的函数,用于创建图像。它接受三个参数:大小、深度和通道数。然后,它返回一个指向新图像的指针。

所以,整个行的作用是创建一个与原始图像(image)大小相同的灰度图像,并将其赋值给 gray_image。这样,gray_image 就成为了一个单通道的灰度图像,可以在后续的图像处理中使用。

cvCvtColor

使用OpenCV库中的 cvCvtColor 函数将彩色图像转换为灰度图像。让我解释一下:

cvCvtColor(image, gray_image, CV_RGB2GRAY);
  1. image: 这是原始的彩色图像,即要进行颜色转换的图像。
  2. gray_image: 这是目标图像,即将结果存储到的图像。在这里,它是先前创建的灰度图像。
  3. CV_RGB2GRAY: 这是颜色转换的标志。在这里,CV_RGB2GRAY 表示从RGB(彩色)到灰度的颜色转换。这将把彩色图像中的每个像素转换为相应的灰度值。

所以,整个行的作用是将原始彩色图像 image 转换为灰度图像,并将结果存储在 gray_image 中。这是常见的图像处理操作,将彩色图像转换为灰度图像通常用于简化图像处理流程,降低计算复杂性。

完整示例代码

program cv_CvtColor;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils,
  ocv.highgui_c,
  ocv.core_c,
  ocv.core.types_c,
  ocv.imgproc_c,
  ocv.imgproc.types_c,
  uResourcePaths;

const
  filename = cResourceMedia + 'opencv_logo_with_text.png';
  filename_gray = cResourceMedia + 'opencv_logo_with_text_gray.png';

var
  image: pIplImage = nil;
  gray_image: pIplImage = nil;

begin
  try
    image := cvLoadImage(filename, 1);
    //创建一个纯灰度图片
    gray_image := cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
    //把image图像灰度化存到gray_image
    cvCvtColor(image, gray_image, CV_RGB2GRAY);
    //保存gray_image
    cvSaveImage(filename_gray, gray_image);
    cvNamedWindow(filename, CV_WINDOW_AUTOSIZE);
    cvNamedWindow('Gray image', CV_WINDOW_AUTOSIZE);
    cvShowImage(filename, image);
    cvShowImage('Gray image', gray_image);
    cvWaitKey(0);
    cvReleaseImage(image);
    cvReleaseImage(gray_image);
    cvDestroyAllWindows;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;

end.
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
摘要: 本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。 目录  [隐藏] 1 一、简介 1.1 1、OpenCV的特点 1.1.1 (1) 总体描述 1.1.2 (2) 功能 1.1.3 (3) OpenCV模块 1.2 2、有用的学习资源 1.2.1 (1) 参考手册: 1.2.2 (2) 网络资源: 1.2.3 (3) 书籍: 1.2.4 (4) 视频处理例程(在 /samples/c/): 1.2.5 (5) 图像处理例程 (在 /samples/c/): 1.3 3、OpenCV 命名规则 1.3.1 (1) 函数名: 1.3.2 (2) 矩阵数据类型: 1.3.3 (3) 图像数据类型: 1.3.4 (4) 头文件: 1.4 4、编译建议 1.4.1 (1) Linux: 1.4.2 (2) Windows: 1.5 5、C例程 2 二、GUI 指令 2.1 1、窗口管理 2.1.1 (1) 创建和定位一个新窗口: 2.1.2 (2) 载入图像: 2.1.3 (3) 显示图像: 2.1.4 (4) 关闭窗口: 2.1.5 (5) 改变窗口大小: 2.2 2、输入处理 2.2.1 (1) 处理鼠标事件: 2.2.2 (2) 处理键盘事件: 2.2.3 (3) 处理滑动条事件: 3 三、OpenCV的基本数据结构 3.1 1、图像数据结构 3.1.1 (1) IPL 图像: 3.2 2、矩阵与向量 3.2.1 (1) 矩阵: 3.2.2 (2) 一般矩阵: 3.2.3 (3) 标量: 3.3 3、其它结构类型 3.3.1 (1) 点: 3.3.2 (2) 矩形框大小(以像素为精度): 3.3.3 (3) 矩形框的偏置和大小: 4 四、图像处理 4.1 1、图像的内存分配与释放 4.1.1 (1) 分配内存给一幅新图像: 4.1.2 (2) 释放图像: 4.1.3 (3) 复制图像: 4.1.4 (4) 设置/获取感兴趣区域ROI: 4.1.5 (5) 设置/获取感兴趣通道COI: 4.2 2、图像读写 4.2.1 (1) 从文件中读入图像: 4.2.2 (2) 保存图像: 4.3 3、访问图像像素 4.3.1 (1) 假设你要访问第k通道、第i行、第j列的像素。 4.3.2 (2) 间接访问: (通用,但效率低,可访问任意格式的图像) 4.3.3 (3) 直接访问: (效率高,但容易出错) 4.3.4 (4) 基于指针的直接访问: (简单高效) 4.3.5 (5) 基于 c++ wrapper 的直接访问: (更简单高效) 4.4 4、图像转换 4.4.1 (1) 字节型图像的灰度-彩色转换: 4.4.2 (2) 彩色图像->灰度图像: 4.4.3 (3) 不同彩色空间之间的转换: 4.5 5、绘图指令 4.5.1 (1) 绘制矩形: 4.5.2 (2) 绘制圆形: 4.5.3 (3) 绘制线段: 4.5.4 (4) 绘制一组线段: 4.5.5 (5) 绘制一组填充颜色的多边形: 4.5.6 (6) 文本标注: 5 五、矩阵处理 5.1 1、矩阵的内存分配与释放 5.1.1 (1) 总体上: 5.1.2 (2) 为新矩阵分配内存: 5.1.3 (3) 释放矩阵内存: 5.1.4 (4) 复制矩阵: 5.1.5 (5) 初始化矩阵: 5.1.6 (6) 初始化矩阵为单位矩阵: 5.2 2、访问矩阵元素 5.2.1 (1) 假设需要访问一个2D浮点型矩阵的第(i, j)个单元. 5.2.2 (2) 间接访问: 5.2.3 (3) 直接访问(假设矩阵数据按4字节行对齐): 5.2.4 (4) 直接访问(当数据的行对齐可能存在间隙时 possible alignment gaps): 5.2.5 (5) 对于初始化后的矩阵进行直接访问: 5.3 3、矩阵/向量运算 5.3.1 (1) 矩阵之间的运算: 5.3.2 (2) 矩阵之间的元素级运算: 5.3.3 (3) 向量乘积: 5.3.4 (4) 单一矩阵的运算: 5.3.5 (5) 非齐次线性方程求解: 5.3.6 (6) 特征值与特征向量 (矩阵为方阵): 6 六、视频处理 6.1 1、从视频流中捕捉一帧画面 6.1.1 (1) OpenCV 支持从摄像头或视频文件(AVI格式)中捕捉帧画面. 6.1.2 (2) 初始化一个摄像头捕捉器: 6.1.3 (3) 初始化一个视频文件捕捉器: 6.1.4 (4) 捕捉一帧画面: 6.1.5 (5) 释放视频流捕捉器: 6.2 2、获取/设置视频流信息 6.2.1 (1) 获取视频流设备信息:
OpenCV是一个广泛使用的计算机视觉库,用于图像和视频处理。下面是一些OpenCV图像处理的基础知识: 1. 图像加载和显示:使用OpenCV可以加载和显示图像。可以使用`cv2.imread()`函数加载图像,并使用`cv2.imshow()`函数显示图像。 2. 图像保存:使用`cv2.imwrite()`函数可以将图像保存到文件中。 3. 图像通道:彩色图像由三个颜色通道(红色、绿色和蓝色)组成,每个通道都是一个灰度图像。可以使用`cv2.split()`函数将彩色图像拆分成单个通道,并使用`cv2.merge()`函数将单个通道合并成彩色图像。 4. 图像缩放:可以使用`cv2.resize()`函数调整图像的大小。可以指定新的宽度和高度,或者指定缩放因子。 5. 图像旋转:可以使用`cv2.getRotationMatrix2D()`函数获得旋转矩阵,并使用`cv2.warpAffine()`函数对图像进行旋转。 6. 图像平滑:可以使用不同的滤波器对图像进行平滑处理,如均值滤波器、高斯滤波器等。可以使用`cv2.blur()`函数进行均值滤波,使用`cv2.GaussianBlur()`函数进行高斯滤波。 7. 图像边缘检测:可以使用不同的边缘检测算法,如Sobel算子、Canny边缘检测等。可以使用`cv2.Sobel()`函数进行Sobel算子边缘检测,使用`cv2.Canny()`函数进行Canny边缘检测。 8. 图像阈值处理:可以使用不同的阈值处理方法对图像进行二值化处理,如全局阈值、自适应阈值等。可以使用`cv2.threshold()`函数进行全局阈值处理,使用`cv2.adaptiveThreshold()`函数进行自适应阈值处理。 以上是OpenCV图像处理的一些基础知识,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

D-Nolan

请我喝杯咖啡吧,鼓励一下创作!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值