【OpenCV C++20 学习笔记】操作图片

概述

在本专栏的第一篇文章中就介绍了一个用OpenCV处理图片的实例(《图片处理基础》),这篇文章进一步详细介绍OpenCV中处理图片的一些操作。
我这里使用的都是C++20的初始化语法,之前版本的C++可以参考下面这节中不同版本C++语法的对比。

图片的导入和保存

从图片文件中导入图片数据:

Mat img = imread(filename);
Mat imgCpp20 {
    imread(filename) };	//C++20的初始化语法

如果导入的是jpg格式的图片,那么默认是3通道的图像数据。如果想要以灰度(只有黑白两色)格式导入,可以这样导入:

Mat img = imread(filename, IMREAD_GRAYSCALE);
Mat imgCpp20 {
    imread(filename, IMREAD_GRAYSCALE) };	//C++20的初始化语法

要将数据保存到图片:

imwrite(filename, img);

对导入的图片的操作

获取像素值

要获取像素的值,必须要知道图片的类型以及颜色通道数量。

关于图片数据的类型,可以参考该合集中的《基本图像容器——Mat》

如果要获取一个单通道灰度图片(即,8UC1类型)中(x, y)坐标上的像素的值,可以使用下面这条语句:

Scalar intensity {
    img.at<uchar>(y, x) };

**注意这里坐标的表示是(y, x)。**因为在OpenCV中图片都是用矩阵来表示的,而矩阵一般是通过(row, col)的先行后列的模式来定位的,为了统一,OpenCV中坐标的表示也是纵坐标在前、横坐标在后。
在C++中,还可以使用Point来换回传统的坐标表示:

Scalar intensity {
    img.at<uchar>(Point(x, y) };

如果是3通道的BGR格式的图片,要获取某个像素上每个通道的颜色值,可以使用以下方法:

Vec3b intensity {
    img.at<Vec3b>(y, x) };
uchar blue {
    intensity.val[0] };
uchar green {
    intensity.val[1] };
uchar red {
    intensity.val[2] };

可以看到,储存单通道的像素值,使用的是Scalar类型;而储存3通道的像素值,使用的是Vec3b类型;3通道中单个通道的颜色值则是uchar类型。
获取像素值的方法也可以用来修改像素值:

img.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值