智能黑白图像自动上色——C++实现

前言

《Colorful Image Colorization》是加里福利亚大学Richard Zhang发表在ECCV 2016上的文章,论文主要解决的问题是给灰度图的自动着色,算法并不是为恢复灰度图的真实颜色,而是用灰度图中物体的纹理、语义等信息作为线索,来预测可能的上色,最后的上色结果只要真实即可。这不仅降低了上色的难度,而且也符合人们的认知:比如一个苹果,给它上青色,上红色都是正常的,不限于某一个颜色,只要不是紫色黑色等奇怪的颜色。
在这里插入图片描述
 算法模型处理步骤是,输入图片的L通道,使用一个CNN预测对应的ab通道取值的概率分布,最后转化为RGB图像结果。
 官方给的测试效果图:
在这里插入图片描述
算法代码:https://github.com/richzhang/colorization

C++ 模型推理

1.这里使用的开发环境是win10,显卡RTX3080,cuda10.2,cudnn7.1,OpenCV4.5,NCNN,IDE 是Vs2019。
2.模型是从onnx转成ncnn的模型,转换方法可以参考ncnn的官网。
3.代码步骤就是加载模型后,输入一张灰度图像,模型给图像上色,输出一张彩色图像。
在这里插入图片描述

4.C++源码

#pragma once
#include <ncnn/net.h>
#include <ncnn/layer.h>
#include <opencv2/opencv.hpp>class Color
{
public:Color();~Color();int read_models(std::string param_path, std::string model_path, bool use_gpu);int image_color(cv::Mat& cv_src, cv::Mat& cv_dst);private:ncnn::Net net;int width = 256;int height = 256;
};
#include "Color.h"class Sig17Slice : public ncnn::Layer
{
public:Sig17Slice(){one_blob_only = true;}virtual int forward(const ncnn::Mat& bottom_blob, ncnn::Mat& top_blob, const ncnn::Option& opt) const{int w = bottom_blob.w;int h = bottom_blob.h;int channels = bottom_blob.c;int outw = w / 2;int outh = h / 2;//int outc = channels * 4;int outc = channels;top_blob.create(outw, outh, outc, 4u, 1, opt.blob_allocator);if (top_blob.empty())return -100;#pragma omp parallel for num_threads(opt.num_threads)for (int p = 0; p < outc; p++){const float* ptr = bottom_blob.channel(p % channels).row((p / channels) % 2) + ((p / channels) / 2);float* outptr = top_blob.channel(p);for (int i = 0; i < outh; i++){for (int j = 0; j < outw; j++){*outptr = *ptr;outptr += 1;ptr += 2;}ptr += w;}}return 0;}
};DEFINE_LAYER_CREATOR(Sig17Slice)Color::Color()
{
}Color::~Color()
{
}int Color::read_models(std::string param_path, std::string model_path, bool use_gpu)
{net.register_custom_layer("Sig17Slice", Sig17Slice_layer_creator);bool has_gpu = false;#if NCNN_VULKANncnn::create_gpu_instance();has_gpu = ncnn::get_gpu_count() > 0;
#endifbool to_use_gpu = has_gpu && use_gpu;net.opt.use_vulkan_compute = to_use_gpu;int rp = net.load_param(param_path.c_str());int rb = net.load_model(model_path.c_str());if (rp < 0 || rb < 0){return 1;}return 0;
}int Color::image_color(cv::Mat& cv_src, cv::Mat& cv_dst)
{cv::Mat cv_base, cv_lab, cv_channel, cv_input;cv_base = cv_src.clone();cv_base.convertTo(cv_base, CV_32F, 1.0 / 255);cvtColor(cv_base, cv_lab, cv::COLOR_BGR2Lab);cv::extractChannel(cv_lab, cv_channel, 0);resize(cv_channel, cv_input, cv::Size(width, height));ncnn::Mat in(cv_input.cols, cv_input.rows, 1, (void*)cv_input.data);in = in.clone();ncnn::Extractor ex = net.create_extractor();ex.input("input", in);ncnn::Mat out;ex.extract("out_ab", out);cv::Mat colored_LAB(out.h, out.w, CV_32FC2);memcpy((uchar*)colored_LAB.data, out.data, out.w * out.h * 2 * sizeof(float));//get separsted LAB channels a&bcv::Mat a(out.h, out.w, CV_32F, (float*)out.data);cv::Mat b(out.h, out.w, CV_32F, (float*)out.data + out.w * out.h);//Resize a, b channels to origina image sizecv::resize(a, a, cv_base.size());cv::resize(b, b, cv_base.size());cv::Mat chn[] = { cv_channel, a, b };cv::merge(chn, 3, cv_lab);cvtColor(cv_lab, cv_dst, cv::COLOR_Lab2BGR);cv_dst.convertTo(cv_dst, CV_8UC3, 255);return 0;
}

5.运行结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码配置

1.源码地址:https://download.csdn.net/download/matt45m/87374018
2.配置运行环境:
在这里插入图片描述
3.配置包含库:
在这里插入图片描述
4.配置lib路径:
在这里插入图片描述
4.添加链接:
在这里插入图片描述
这个里添加的工程目录下lib下的所的.lib的名字。

GenericCodeGen.lib
glslang.lib
MachineIndependent.lib
ncnn.lib
OGLCompiler.lib
opencv_world450.lib
OSDependent.lib
SPIRV.lib
VkLayer_utils.lib
vulkan-1.lib

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22301.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解密银行客户经理展业利器系列一:商机共享、创收增长

2023年银行业面临存款、贷款、利润三大变局&#xff0c;与此同时&#xff0c;商业银行的数字化转型正延展至前台建设&#xff0c;期望通过科技手段布局应对&#xff0c;数字化重装身处一线的客户经理&#xff0c;带动单位时间创收提升&#xff0c;更有力地支撑银行业务战略发展…

chatgpt赋能python:Python安装paramiko,实现SSH远程连接

Python安装paramiko&#xff0c;实现SSH远程连接 作为一种开源的Python库&#xff0c;Paramiko提供了SSH 协议的实现方式&#xff0c;使得Python程序能够方便地与SSH服务器通信&#xff0c;完成以SSH协议为基础的操作&#xff0c;比如服务器批量管理、远程执行命令和文件传输等…

GPT4 api 申请

从官网申请 GPT4 api 的申请权限&#xff0c;似乎在这之前您必须是一个ChatGPT的plus会员 填写表格 注意&#xff0c;组织ID&#xff0c;从图所示的小字部分点击链接&#xff0c;获取组织ID&#xff0c;也可以点击这How do you primarily plan to use GPT-4? * 这个选项可以…

Unity3d 使用Chart And Graph插件进行数据可视化(柱状图、折线图、饼图等)基本使用

前言 首先来夸夸这个插件&#xff0c;美观性、响应速度和互动性。易于上手和快速设置。每项功能都可以从代码和编辑器中自定义。“图形和图表”兼容性强&#xff0c;包括 VR/AR、移动端、网页和桌面端等。与 UGUI Canvas 完美集成。一句话数据可视化选它完美。 使用 插件导入…

R:热图解释 | pheatmap包参数及详细聚类图绘制流程(一篇解决热图绘制问题)

热图解释及pheatmap绘制热图 一、热图绘制原理1.1 热图介绍1.2 热图绘制准备——均一化1.3 热图绘制方式1.4 热图数据查看示例 二、pheatmap包简介2.1 pheatmap介绍2.2 pheatmap详细参数解释2.3 pheatmap安装及加载 三、pheatmap包绘制热图示例3.1 数据准备3.2 数据导入及绘图3…

R | 可视化 | 热图(Heatmap)

1 基础绘制 R绘制热图时&#xff0c;数据需要输入一个矩阵&#xff0c;可以用as.matrix()把它转换成矩阵。这里利用R自带的数据集绘制热图。 > # 数据 > data <- as.matrix(mtcars) > > # 绘制热图 > heatmap(data) OUTPUT: 热图的每一列是一个变量&…

TeeChart绘制Gant图

软件安装 及使用 VS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入_尘中远的博客-CSDN博客_teechartVS2010 使用TeeChart绘图控件 - 之一 - 控件和类的导入VS2010 使用TeeChart绘图控件 - 之二 - 绘制图形&#xff08;折线图&#xff0c;柱状图&#xff09;TeeChart绘图控…

使用GraphInsight打造TuGraph可视化分析应用

图的可视化是分析和理解图数据的一种重要手段。TuGraph 内置了TuGraph Browser&#xff0c;为大多数用户提供了一个简单易用的图可视化界面。由于 TuGraph Browser 不支持自定义界面&#xff0c;因此一些有自定义界面需求的用户只能选择自行搭建新的前端界面。11月22日&#xf…

热图 -- pheatmap or ggplot2

文章目录 brief数据准备 pheatmap实例最朴素的方式数据缩放取消聚类更改每个小方格的大小聚类以及聚类方式和参数修改热图呈现的颜色修改legend ggplot2实例ggplot2实例变式添加 group bar做成dotplot pheatmap 多图组合问题 brief 这里主要记录了pheatmap 以及 ggplot2实现热…

GTK渲染摄像头图像数据

GTK渲染摄像头图像数据 1.GDK简介 绘图工具集(GDK&#xff0c;Graphics Drawing Kit)是在GTK 和特定操作系统的应用编程接口(API,Application Program Interface)之间的低级绘图制层—— Linux的API是Xlib。由于GTK和机器的API之间没有直接接口&#xff0c;移植GTK就成为移植G…

Pheatmap热图的绘制及如何调整图片

Pheatmap热图的绘制及如何调整图片 Pheatmap包是R语言绘制热图比较强大的软件包&#xff0c;当然现在也有很多资料介绍这个包的使用&#xff0c;但是今天我写的重点不是如何使用这个包绘制热图&#xff0c;而是如何绘制出更好看的热图。&#xff08;我使用的矩阵是1663x594&am…

unity可视化图表插件XCharts绘制折线图、饼图、柱状图

一、简介 一款基于UGUI的功能强大、易用、参数可配置的数据可视化图表插件。支持折线图、柱状图、饼图、雷达图、散点图、热力图等常见图表。 特性&#xff1a; 内置丰富示例和模板&#xff0c;参数可视化配置&#xff0c;效果实时预览&#xff0c;纯代码绘制。 支持折线图、柱…

日语学习软件推荐——五十音图APP:AI纠正你的日语发音

每个自学日语的人&#xff0c;想必都经历过“哑巴日语”的苦恼。收集了很多学习资料&#xff0c;努力积累词汇量&#xff0c;一开口却暴露了“散装口语”的短板。 但是现在就不怕这个问题啦&#xff0c;五十音图APP可以让你从入门开始&#xff0c;练就一口流利的地道日语&…

白痴学日语系列之初识日语(二)

每日记单词 間[あいだ]0 a i da 间&#xff0c;间隔 【记】あい&#xff08;合い→互相之间&#xff09;だ&#xff08;是&#xff09;→间隔 青[あお]1 a o 蓝色&#xff1b;青色&#xff1b;绿色&#xff1b;不成熟 【记】あ&#xff08;上&#xff09;お&#xff08;う→…

新标日语学习笔记

文章目录 新标日语学习笔记第一章 日语入门1.1 五十音1.2 日语声调1.2.1 声调理解1.2.2 高低音发音1.2.3 简单的高低音发音练习 1.3 浊音和长音1.3.1 浊音1.3.2 长音 1.4 促音和拗音 第二章 课文与笔记2.1 小李是中国人2.1.1 单词2.1.2 语法 新标日语学习笔记 第一章 日语入门…

日语语音识别_日语语音识别软件_日语语音识别在线 - 云+社区 - 腾讯云

广告关闭 腾讯云双11爆品提前享&#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高满返5000元&#xff01; 语气词过滤和句末标点过滤用户自主选择功能 新功能发布录音文件识别产品上线音视频领域模型 新功能发布…

C++制作一款小黑子键盘提示音程序

不好意思我漏出鸡脚了。 首先讲一下思路&#xff0c;这次制作的小黑子相当于键盘提示音&#xff0c;输入J,N,T,M&#xff0c;会发出“鸡你太美”的声音&#xff0c;连续按下JNTM则会发出“你干嘛啊&#xff0c;哎呦”的声音。 完整的工程和代码以及成品已经上传至百度网盘&…

只因小黑子:css动画复习

小黑子的css动画复习 css动画1. transiton 动画过渡1.1 transiton: 某属性1.2 transiton: all2. 动画过渡类型3. 动画过渡单一属性4. transform 2d属性4.1 translate 平移一、translateX(参数) 水平平移二、translateY(参数) 上下平移三、translate(a,b) 水平&#xff0c;上下平…

小黑子的HTML入土过程

小黑子的HTML入土过程 1. HTMLCSS系列教程第一章1.1 了解什么是HTML和CSS1.2 编译器VS Code1.2.1 下载方式和设置1.2.2 VS Code的快捷键基础用法 1.3 了解网页开发1.4 Web前端的三大核心技术1.5 HTML的基本结构和属性1.6 HTML的初始代码1.7 HTML的注释1.8 HTML的语义化1.9 标题…