OpenCV4 :基础图像处理与操作(一)
目录
- 图像的基本概念与术语
- 图像表示
- 基础术语
- 图像读取与显示方法
- C++ 示例
- 色彩空间的理解与转换
- 色彩空间
- RGB(红绿蓝)
- CMYK(青色、黄色、品红、黑色)
- HSV(色相、饱和度、明度)
- 色彩转换
- 图像对象的创建与赋值
- C++ 示例
- 基础图像操作:像素读写与算术运算
- 像素读写
- 算术运算
本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C++ 中进行图像读取、显示和基础操作。
1. 图像的基本概念与术语
图像表示
在计算机视觉中,图像通常表示为一个二维或三维的数组。二维数组表示灰度图像,其中每个元素代表一个像素的亮度。三维数组表示彩色图像,通常使用 RGB(红、绿、蓝)色彩模型。
基础术语
- 像素(Pixel):图像的基本单位。
- 分辨率(Resolution):图像的宽度和高度(例如,1920x1080)。
- 位深度(Bit Depth):每个像素可以使用的色彩范围(例如,8位表示256种可能的值)。
2. 图像读取与显示方法
在 OpenCV 中,图像可以容易地读取和显示。
C++ 示例
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image = cv::imread("image.jpg");
cv::imshow("Image", image);
cv::waitKey(0);
return 0;
}
3. 色彩空间的理解与转换
色彩空间
色彩空间是用数学的方式描述色彩的模型或系统。这些模型或系统通常被用于各种应用,包括图像处理、视频编码、打印和数字艺术等。常见的色彩空间有 RGB、HSV、CMYK 等。
RGB(红绿蓝)
- 由来:RGB 色彩模型的由来主要是基于人类视觉系统对红、绿、蓝三种基础色彩的感知能力。因为这三种颜色可以组合生成大多数可见光谱中的颜色,所以它们被选为基础色。
- 用途:RGB 主要用于各种显示设备(如电视、电脑屏幕、手机屏幕等)、图像和视频编码。在这些应用中,红绿蓝三种色光以不同比例混合,从而产生各种各样的颜色。
CMYK(青色、黄色、品红、黑色)
- 由来:CMYK 色彩模型是为印刷工业设计的。与 RGB 不同,它是一种减色模型。这意味着,在纸上叠加更多的墨水会使颜色变暗,直至变成黑色。
- 用途:CMYK 主要用于彩色印刷。由于印刷过程中使用的是墨水,所以需要使用减色模型。
HSV(色相、饱和度、明度)
- 由来:HSV 色彩模型是为了更符合人类对色彩感知的方式而设计的。与 RGB 和 CMYK 相比,HSV 更容易让人直观地理解色彩的属性。
- 用途:HSV 常用于图像处理、图形设计和数字艺术等领域,因为它更容易模拟颜色的混合和渐变效果。
色彩转换
在 OpenCV 中,色彩转换可以使用 cvtColor
函数实现。
C++ 示例
cv::Mat gray_image;
cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
参考:OpenCV: Color Space Conversions
4. 图像对象的创建与赋值
在 OpenCV 中,cv::Mat
(C++)用于表示图像。
C++ 示例
cv::Mat blank_image(512, 512, CV_8UC3, cv::Scalar(0,0,0));
5. 基础图像操作:像素读写与算术运算
像素读写
C++ 示例
cv::Vec3b pixel_value = image.at<cv::Vec3b>(50, 50);
image.at<cv::Vec3b>(50, 50) = cv::Vec3b(255, 0, 0);
算术运算
加法、减法、乘法和除法等算术运算也可以很容易地应用到图像上。
// 创建两个 256x256 大小的图像,一个红色,一个蓝色
cv::Mat red_image(256, 256, CV_8UC3, cv::Scalar(0, 0, 255));
cv::Mat blue_image(256, 256, CV_8UC3, cv::Scalar(255, 0, 0));
// 加法运算
cv::Mat addition_result = red_image + blue_image;
// 减法运算
cv::Mat subtraction_result = red_image - blue_image;
// 乘法运算 - 图像混合示例
cv::Mat blend_alpha(256, 256, CV_8UC3, cv::Scalar(0.5, 0.5, 0.5)); // alpha通道为0.5
cv::Mat multiplication_result;
cv::multiply(red_image, blend_alpha, multiplication_result, 1.0 / 255); // 正规化因子 1/255
// 除法运算 - 归一化示例
cv::Mat division_result;
cv::divide(red_image, cv::Scalar(255, 255, 255), division_result); // 归一化到 [0, 1] 范围
// 显示结果
cv::imshow("Addition Result", addition_result);
cv::imshow("Subtraction Result", subtraction_result);
cv::imshow("Multiplication Result", multiplication_result);
cv::imshow("Division Result", division_result);
下一篇文章中,将介绍新的图像和视频编解码器技术
公众号:coding日记