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;
}