数字图像处理基础

Author Avatar
Euan 9月 11, 2019
  • 在其它设备中阅读本文章

步骤

打开图像并显示基本信息

KEJ1nf.png
KEJ8HS.png
KEJ4u6.png

转换过程

灰度化函数

cvtColor(img, imgGray, CV_BGR2GRAY);

img为原图,imgGray为灰度图

二值化函数

threshold(imgGray, result, 100, 255, CV_THRESH_BINARY);

在阈值中的像素点将变为0(白色部分),阈值之外的像素将变为1(黑色部分)。

KEJQjP.png

输出像素值

指针遍历

KEJ1nf.png

截取2/1灰度图像

  • 其中:Rect的函数定义为: Rect(_Tp _x, _Tp _y, _Tp _width, _Tp _height);

_Tp _x:表示矩形左上角顶点的x坐标; _Tp _y:表示矩形左上角顶点的y坐标;

_Tp _width:表示矩形框的宽度 ; _Tp _height:表示矩形框的高度

KEJ4u6.png

输出图像

KEJ3B8.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
源代码
#include<iostream>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
Mat img, imgGray, result;
img = imread("aaa.png");
int row = img.rows;//获取行数
//cout << row << endl;
int col = img.cols * img.channels();//注意是列数*通道数
cout << "分辨率为:" << row << "*" << img.cols << endl;
for (int i = 9; i < 12; ++i)
{
uchar* data = img.ptr<uchar>(i);//获取第i行首地址
for (int j = 9; j < 13; ++j)
{
cout << "第" << i + 1 << "行" << "第" << j + 1 << "列的像素值为" << int(*data) << endl;
data++;
}
}
cvtColor(img, imgGray, CV_BGR2GRAY);
imshow("灰度图", imgGray);
imshow("原图", img);
Rect m_select = Rect(0, 0, imgGray.cols/2 ,imgGray.rows / 2);
Mat ROI = imgGray(m_select);
imshow("一半分辨率图", ROI);
//blur(imgGray, imgGray, Size(3, 3));
threshold(imgGray, result, 50, 150, CV_THRESH_BINARY);
imshow("二值化后的图", result);
imwrite("aaa_gray.png", imgGray);
cout << "图片已保存" << endl;
waitKey();

return 0;
}

本文使用 CC BY-NC-SA 3.0 中国大陆 协议许可
具体请参见 知识共享协议

本文链接:https://zyhang8.github.io/2019/09/11/cv-exp1/