0
点赞
收藏
分享

微信扫一扫

【opencv学习笔记】005之读像素(获取像素)及写像素(修改像素、空白图像、分割图像)


目录

​​一、前言​​

​​二、图像像素操作​​

​​1、读像素​​

​​2、写像素​​

​​三、全部代码及结果展示​​

​​1、代码​​

​​2、运行效果图​​

一、前言

欠下的总是要还的,继续给大家更新有关于OpenCV的教程,我也不知道能不能保证每天一篇,有时候真的是时间不够,希望能够得到大家的谅解,争取保证一周至少2-3篇吧。

今天要接着讲图像像素操作,与上一篇博客不同,这一篇会讲到操作每一个像素,包括读像素值、写像素值。

二、图像像素操作

1、读像素

1.读像素是什么?

二维图像保存在电脑中,大家可以理解为矩阵,一个二维数组,每个位置都会有一个像素值。

读像素,就是获取某个点处的像素值。

2.相应API

读取像素值时,不同的图像,读取过程有些差别。图像主要是两种:灰度图与RGB图,即黑白图像与彩色图像。

1.黑白图像

注意:y 是行,x 是列,所以先写 y ,再写 x 。

Scalar intensity = image.at<uchar>(y, x); //y 是行,x是列,所以先写y,再写x

如果是按照点去访问,就是按照坐标,先 x 后 y 。

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

 2.彩色图像

彩色图像有RGB三通道,

注意:顺序不是RGB,而是BGR

我们通过行指针,可以获取到该行的的所有点,即所有像素。

Vec3f intensity = image.at<Vec3f>(y, x); 
float blue = intensity.val[0]; //蓝
float green = intensity.val[1]; //绿
float red = intensity.val[2]; //红

 

2、写像素

1.写像素是什么?

读像素是获取某一点的像素值,获取之后,我们就可以对像素值进行修改,这就是写像素,也可以叫修改像素。

2.写像素代码

1.修改像素值

修改像素值是在获取像素的基础上,进行赋值操作。

//灰度图像
image.at<uchar>(y, x) = 128;

//RGB三通道图像
image.at<Vec3b>(y,x)[0]=128; // blue
image.at<Vec3b>(y,x)[1]=128; // green
image.at<Vec3b>(y,x)[2]=128; // red

2.设置空白图像

设置空白图像是直接将图像的像素直接设为0。(当为0为黑色,全为255为白色)

image = Scalar(0);

 运行结果如下图:

【opencv学习笔记】005之读像素(获取像素)及写像素(修改像素、空白图像、分割图像)_读像素

3.选取固定范围

选取固定范围是将图像中输入范围内的点切割出来,并删除掉剩余像素点。

Rect r(10, 10, 350, 200);  //设置选区
Mat smallImg = image(r); //图像分割

 

三、全部代码及结果展示

1、代码

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main(int argc, char** args) {
Mat image = imread("E:/image/hand.jpg", IMREAD_COLOR);
if (image.empty()) {
cout << "could not find the image resource..." << std::endl;
return -1;
}

//image = Scalar(0);
int height = image.rows;
int width = image.cols;
int channels = image.channels();
printf("height=%d width=%d channels=%d", height, width, channels);

Rect r(10, 10, 350, 200); //设置选区
Mat smallImg = image(r); //图像分割

for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (channels == 3) {
image.at<Vec3b>(row, col)[0] = 0; // blue
image.at<Vec3b>(row, col)[1] = 0; // green


}
}
}

namedWindow("My Image", CV_WINDOW_AUTOSIZE);
imshow("My Image", image);

namedWindow("Small Image", CV_WINDOW_AUTOSIZE);
imshow("Small Image", smallImg);
waitKey(0);
return 0;
}

2、运行效果图


【opencv学习笔记】005之读像素(获取像素)及写像素(修改像素、空白图像、分割图像)_空白图像_02

写像素操作

 


【opencv学习笔记】005之读像素(获取像素)及写像素(修改像素、空白图像、分割图像)_写像素_03

选区分割

 

今天的内容就讲到这里啦,有什么问题,大家可以在下面留言哦!

举报

相关推荐

0 条评论