#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
必须包含的头文件! 才能开始编写代码
读取相片 一般来说加个保护程序 不至于出error和卡死
Mat image = imread("test.webp"); //存放自己图像的路径
if (image.empty())
{
printf("could not load image...\r\n");
return -1;
}
创造一个Mat形的变量(手动的灰度制作)
int h = image.rows;
int w = image.cols;
//gray
Mat graymat;
graymat.create(h, w, CV_8UC1);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
int grayvalue = (image.at<Vec3b>(j, i)[0] + image.at<Vec3b>(j, i)[1] + image.at<Vec3b>(j, i)[2]) / 3;
graymat.at<uchar>(j, i) = grayvalue;
}
}
imshow("显示图像2",graymat);
waitKey(0);
destroyAllWindows();
其中有个操作每点操作像数值的操作 需要学习
graymat.at<uchar>(j, i)
这是一个像素点的值,也就是如果为RGB的话,那么也是三个通道的,只有灰度才能直接用,因为灰度就一个值。如果是RGB就需要如下使用各个通道0 1 2
image.at<Vec3b>(j, i)[0]
如下是手动制作二进制图,就是遍历每个像素,判断阈值进行0和255的赋值罢了
Mat binarymat;
binarymat.create(h, w, CV_8UC1);
for (int j = 0; j < h; j++) {
for (int i = 0; i < w; i++) {
if (graymat.at<uchar>(j, i) > 100) { binarymat.at<uchar>(j, i) = 255;}
else {
binarymat.at<uchar>(j, i) = 0;
}
}
}
效果图:
第一期学习结束!