C++/opencv遍历图像像素值,创建并绘制新的图像,并和原图融合

C++/opencv遍历图像像素值,创建并绘制新的图像,并和原图融合

代码的主要功能:
主要是给原图,图上一层颜色,不同的类别对应不同的颜色
ori_img:
在这里插入图片描述
label_img:
在这里插入图片描述
通过读取 label_img生成彩色图:
在这里插入图片描述
和原图融合:
在这里插入图片描述
1、有 ori.jpg原图 和 label.png对应的灰度图,其中灰度图中像素值从 0-9不等
2、通过读取 label.png中的像素值,生成对应的彩色图
3、将生成的彩色图和原图融合

代码如下:
1、单张处理程序

#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	Mat img_in = imread("C:/Users/xujun/Desktop/front_img/002_003003_102837851.png", 0); //灰度图,label图片
	Mat img_ori = imread("C:/Users/xujun/Desktop/front_img/oriImg/002_003003_102837851.jpg"); //原图像
	Mat img_out(img_in.rows, img_in.cols, CV_8UC3, Scalar(0, 0, 0));  //输出图形
	 
	vector<Vec3b> rgb_pixels;  //创建 rgb像素点列表
	rgb_pixels = { 
		{ 0, 0, 0 },
		{ 165, 42, 42 },
		{ 0, 192, 0 },
		{ 255, 130, 71 },
		{ 90, 120, 150 },
		{ 102, 102, 156 },
		{ 128, 64, 255 },
		{ 255, 255, 0 },
		{ 220, 20, 60 },
		{ 244, 35, 232 }
	};


	for (int i = 0; i < img_in.rows; i++) //遍历label图像的每一个像素点,然后相应的生成一个新的彩色图
	{
		for (int j = 0; j < img_in.cols; j++)
		{
			if (img_in.at<uchar>(i, j) == 0)
				img_out.at<Vec3b>(i, j) = rgb_pixels[0];
			if (img_in.at<uchar>(i, j) == 1)
				img_out.at<Vec3b>(i, j) = rgb_pixels[1];
			if (img_in.at<uchar>(i, j) == 2)
				img_out.at<Vec3b>(i, j) = rgb_pixels[2];
			if (img_in.at<uchar>(i, j) == 3)
				img_out.at<Vec3b>(i, j) = rgb_pixels[3];
			if (img_in.at<uchar>(i, j) == 4)
				img_out.at<Vec3b>(i, j) = rgb_pixels[4];
			if (img_in.at<uchar>(i, j) == 5)
				img_out.at<Vec3b>(i, j) = rgb_pixels[5];
			if (img_in.at<uchar>(i, j) == 6)
				img_out.at<Vec3b>(i, j) = rgb_pixels[6];
			if (img_in.at<uchar>(i, j) == 7)
				img_out.at<Vec3b>(i, j) = rgb_pixels[7];
			if (img_in.at<uchar>(i, j) == 8)
				img_out.at<Vec3b>(i, j) = rgb_pixels[8];
			if (img_in.at<uchar>(i, j) == 9)
				img_out.at<Vec3b>(i, j) = rgb_pixels[9];
			
		}

	}

	Mat result;
	addWeighted(img_out, 1, img_ori, 0.8, 0, result); //将生成的彩色图和原图融合,得到结果
	namedWindow("result",0);
	imshow("result",result);
	waitKey(0);
	//imwrite("C:/Users/xujun/Desktop/front_img/0002.png", result);

	return 0;
}

2、多张处理程序

#include <fstream>
#include <sstream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;


//{ 0, 192, 0 },
//{ 190, 153, 153 },
//{ 90, 120, 150 },
//{ 102, 102, 156 },
//{ 128, 64, 255 },
//{ 250, 170, 160 },
//{ 150, 120, 90 },
//{ 244, 35, 232 }
int main()
{
	vector<Vec3b> rgb_pixels;  //创建 rgb像素点列表
	rgb_pixels = { 
		{ 0, 0, 0 },
		{ 165, 42, 42 },
		{ 0, 192, 0 },
		{ 255, 130, 71 },
		{ 90, 120, 150 },
		{ 102, 102, 156 },
		{ 128, 64, 255 },
		{ 255, 255, 0 },
		{ 220, 20, 60 },
		{ 244, 35, 232 }
	};
	string path_label = "C:/Users/xujun/Desktop/front_img/label3";
	string path_ori = "C:/Users/xujun/Desktop/front_img/oriImg";
	string path_out = "C:/Users/xujun/Desktop/front_img/outpath";
	vector<cv::String> filenames;
	glob(path_label, filenames,false);
	for (int i = 0; i < filenames.size(); i++)
	{
		cout << filenames[i] << endl;
		int str_begin1 = filenames[i].find_last_of('\\');
		int str_begin2 = filenames[i].find_last_of('.');
		int str_end = filenames[i].size();
		std::string filename_base = filenames[i].substr(str_begin1 + 1, str_begin2 - str_begin1 - 1);
		string oripath = path_ori + "/" + filename_base + ".jpg";
		string save_path = path_out + "/" + filename_base + ".jpg";

		Mat img_in = imread(filenames[i], 0); //灰度图,label图片
		Mat img_ori = imread(oripath); //原图像
		Mat img_out(img_in.rows, img_in.cols, CV_8UC3, Scalar(0, 0, 0));  //输出图形

		for (int i = 0; i < img_in.rows; i++) //遍历label图像的每一个像素点,然后相应的生成一个新的彩色图
		{
			for (int j = 0; j < img_in.cols; j++)
			{
				if (img_in.at<uchar>(i, j) == 0)
					img_out.at<Vec3b>(i, j) = rgb_pixels[0];
				if (img_in.at<uchar>(i, j) == 1)
					img_out.at<Vec3b>(i, j) = rgb_pixels[1];
				if (img_in.at<uchar>(i, j) == 2)
					img_out.at<Vec3b>(i, j) = rgb_pixels[2];
				if (img_in.at<uchar>(i, j) == 3)
					img_out.at<Vec3b>(i, j) = rgb_pixels[3];
				if (img_in.at<uchar>(i, j) == 4)
					img_out.at<Vec3b>(i, j) = rgb_pixels[4];
				if (img_in.at<uchar>(i, j) == 5)
					img_out.at<Vec3b>(i, j) = rgb_pixels[5];
				if (img_in.at<uchar>(i, j) == 6)
					img_out.at<Vec3b>(i, j) = rgb_pixels[6];
				if (img_in.at<uchar>(i, j) == 7)
					img_out.at<Vec3b>(i, j) = rgb_pixels[7];
				if (img_in.at<uchar>(i, j) == 8)
					img_out.at<Vec3b>(i, j) = rgb_pixels[8];
				if (img_in.at<uchar>(i, j) == 9)
					img_out.at<Vec3b>(i, j) = rgb_pixels[9];				
			}
		}
		Mat result;
		addWeighted(img_out, 1, img_ori, 0.7, 0, result); //将生成的彩色图和原图融合,得到结果
		imwrite(save_path, result);
	}

	return 0;
}

可以使用OpenCV中的形状检测功能来检测图像中的长方形。以下是一个简单的示例代码,它可以检测长方形并提取其内容: ```c++ #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 读取图像 Mat image = imread("image.jpg"); // 将图像转换为灰度图像 Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY); // 对图像进行二值化处理 Mat thresh; threshold(gray, thresh, 0, 255, THRESH_BINARY | THRESH_OTSU); // 进行形状检测 vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(thresh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE); // 遍历所有轮廓 for (size_t i = 0; i < contours.size(); i++) { // 计算轮廓的周长 double perimeter = arcLength(contours[i], true); // 进行形状近似 vector<Point> approx; approxPolyDP(contours[i], approx, 0.02 * perimeter, true); // 如果近似形状为四边形,则认为它是一个长方形 if (approx.size() == 4) { // 绘制长方形轮廓 drawContours(image, contours, i, Scalar(0, 0, 255), 2); // 提取长方形内部的内容 Rect rect = boundingRect(contours[i]); Mat roi = image(rect); // 显示提取出的内容 imshow("ROI", roi); } } // 显示结果 imshow("Image", image); waitKey(0); return 0; } ``` 在上面的代码中,我们首先读取图像并将其转换为灰度图像。然后,我们对图像进行二值化处理,并使用`findContours`函数查找所有轮廓。接下来,我们遍历所有轮廓,并使用`approxPolyDP`函数对轮廓进行形状近似。如果近似形状为四边形,则认为它是一个长方形。我们使用`drawContours`函数绘制长方形轮廓,并使用`boundingRect`函数提取长方形内部的内容。最后,我们显示提取出的内容和绘制了长方形轮廓的图像
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值