最新要闻
- 韩国最大在野党:IAEA评估报告未验证福岛核污水安全性
- 天天动态:卖得太火 魅族20 PRO严重缺货!晨曦紫、曙光银今日开启预定
- 全球快播:9.99万价格屠夫!长安第二代UNI-T尊享型上市:入门就有骁龙8155
- 每日速读!小憩、露营、洗车模式上线 岚图梦想家发布OTA2.0版本
- 奔驰变法拉利!男子107万提新车发现竟是翻新车:退一赔三获赔428万_动态焦点
- 新资讯:盘点10款最美游戏:《最后生还者》《艾尔登法环》等入选
- 水深火热成语接龙_热字开头的成语
- 《巨齿鲨2:深渊》最新预告出炉:杰森·斯坦森、吴京大战海底怪兽
- 双泵水冷力压13900KS 310W功耗!超频三DE360水冷散热器评测:静音水泵也很重要 即时焦点
- 头条焦点:华裔学者出手!50年零进展算法难题被突破
- 不顾国内外强烈反对!日本拟最早8月核污水排海|当前观察
- 环球最资讯丨故宫门票提前7天抢不到 黄牛要价翻6倍!全国博物馆几乎都如此
- 世界简讯:突发!俄军一架战机坠毁
- 【天天速看料】火狐发布115版本更新:支持Win7/8最后版本
- 天天微资讯!女子半夜拍蚊子走出158步吓坏母亲:通过微信步数了解家人起居
- 男孩被锁车内父母心疼玻璃不愿砸 路人做好事反被责怪:网友看怒|热资讯
广告
手机
光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 光庭信息跌4.57% 2021上市超募11亿2022扣非降74% 时快讯
- 搜狐汽车全球快讯 | 大众汽车最新专利曝光:仪表支持拆卸 可用手机、平板替代-环球关注
- 视点!美国首位女总统即将诞生?拜登恐怕要提前下岗,美政坛迎来变局?
- 当前速递!用理想仪器实现更好的颗粒 德国新帕泰克亮相CPHI & PMEC China获好评
- 微粒贷怎么申请开通 开通方法如下
- 焦点简讯:心疼!这位40岁的云南缉毒警,已是满头白发
家电
一种基于DeltaE(CIE 1976)的找色算法Cuda实现_即时看
(相关资料图)
书接上文 一种基于DeltaE(CIE 1976)的找色算法
Delta E 是评估色彩准确度的重要测量指标。摄影师、影片编辑和平面设计师等创意专业人士都应重视这项标准,因其是选择专业级显示器的重要考虑因素。常见的找色算法都是基于颜色RGB上的数值差,这种方法虽然快捷,但是和人眼视觉上的色彩并不相同。这里采用Delta E的评估标准找色更符合人眼的直观感觉。上文使用CPU计算,采用了一些优化方法但是都不尽如人意,这里使用cuda加速提高这个算法的可用度。
//计算颜色之间的Delta E//<= 1.0:人眼无法感知差异//1 - 2:仔细观察可以感知差异//2 - 10:随意一看便可以感知差异//11 - 49:色彩的相似程度大于相反程度//100:色彩完全失真#include "cuda_runtime.h"#include "device_launch_parameters.h"#include #include #include cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);struct Color_BGR{ int B, G, R;};struct Color_Lab{ float L, a, b;};Color_Lab BGR2Lab(Color_BGR x){#define gamma(x) (((x) > 0.04045) ? std::pow(((x)+0.055f) / 1.055f, 2.4f) : ((x) / 12.92)); const float param_13 = 1.0f / 3.0f; const float param_16116 = 16.0f / 116.0f; const float Xn = 0.950456f; const float Yn = 1.0f; const float Zn = 1.088754f; float RR = gamma(x.R / 255.0); float GG = gamma(x.G / 255.0); float BB = gamma(x.B / 255.0); float X, Y, Z, fX, fY, fZ; X = 0.4124564f * RR + 0.3575761f * GG + 0.1804375f * BB; Y = 0.2126729f * RR + 0.7151522f * GG + 0.0721750f * BB; Z = 0.0193339f * RR + 0.1191920f * GG + 0.9503041f * BB; X /= (Xn); Y /= (Yn); Z /= (Zn); if (Y > 0.008856f) fY = std::pow(Y, param_13); else fY = 7.787f * Y + param_16116; if (X > 0.008856f) fX = std::pow(X, param_13); else fX = 7.787f * X + param_16116; if (Z > 0.008856) fZ = std::pow(Z, param_13); else fZ = 7.787f * Z + param_16116; float L, a, b; L = 116.0f * fY - 16.0f; L = L > 0.0f ? L : 0.0f; a = 500.0f * (fX - fY); b = 200.0f * (fY - fZ); return { L,a,b };}cudaError_t FindColorCuda(Color_BGR *src, float *ret,Color_Lab target,unsigned int size);__global__ void FindColorCudaKernel(Color_BGR *src, float* ret, Color_Lab target){ int i = blockIdx.x * 256 + threadIdx.x;#define gamma(x) (((x) > 0.04045) ? pow(((x)+0.055f) / 1.055f, 2.4f) : ((x) / 12.92)); const float param_13 = 1.0f / 3.0f; const float param_16116 = 16.0f / 116.0f; const float Xn = 0.950456f; const float Yn = 1.0f; const float Zn = 1.088754f; float RR = gamma(src[i].R / 255.0); float GG = gamma(src[i].G / 255.0); float BB = gamma(src[i].B / 255.0); float X, Y, Z, fX, fY, fZ; X = 0.4124564f * RR + 0.3575761f * GG + 0.1804375f * BB; Y = 0.2126729f * RR + 0.7151522f * GG + 0.0721750f * BB; Z = 0.0193339f * RR + 0.1191920f * GG + 0.9503041f * BB; X /= (Xn); Y /= (Yn); Z /= (Zn); if (Y > 0.008856f) fY = pow(Y, param_13); else fY = 7.787f * Y + param_16116; if (X > 0.008856f) fX = pow(X, param_13); else fX = 7.787f * X + param_16116; if (Z > 0.008856) fZ = pow(Z, param_13); else fZ = 7.787f * Z + param_16116; float L, a, b; L = 116.0f * fY - 16.0f; L = L > 0.0f ? L : 0.0f; a = 500.0f * (fX - fY); b = 200.0f * (fY - fZ); ret[i] = sqrt((L - target.L) * (L - target.L) + (a - target.a) * (a - target.a) + (b - target.b) * (b - target.b));}Color_BGR src_mat[1024 * 1024];float ret_mat[1024 * 1024];int main(){ for (int i = 0; i < 1024 * 1024; i++) { src_mat[i] = { std::rand() % 256,std::rand() % 256, std::rand() % 256 }; } //Pre Run for Best Speed cudaError_t cudaStatus = FindColorCuda(src_mat, ret_mat, BGR2Lab({ 190,35,41 }), 1024 * 1024); if (cudaStatus != cudaSuccess) { fprintf(stderr, "FindColorCuda failed!"); return 1; } int st = clock(); // Add vectors in parallel. cudaStatus = FindColorCuda(src_mat, ret_mat, BGR2Lab({190,35,41}), 1024 * 1024); if (cudaStatus != cudaSuccess) { fprintf(stderr, "FindColorCuda failed!"); return 1; } printf("Cost: %d\n", clock() - st); int count = 0; for (int i = 0; i < 1024*1024 ; i++) { if (ret_mat[i] < 2) count++; } printf("%d", count); // cudaDeviceReset must be called before exiting in order for profiling and // tracing tools such as Nsight and Visual Profiler to show complete traces. cudaStatus = cudaDeviceReset(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceReset failed!"); return 1; } return 0;}//HelpercudaError_t FindColorCuda(Color_BGR* src, float* ret, Color_Lab target, unsigned int size){ Color_BGR* dev_src = nullptr; float* dev_ret = nullptr; cudaError cudaStatus; // Choose which GPU to run on, change this on a multi-GPU system. cudaStatus = cudaSetDevice(0); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaSetDevice failed! Do you have a CUDA-capable GPU installed?"); goto Error; } // Allocate GPU buffers for three vectors (two input, one output) . cudaStatus = cudaMalloc((void**)&dev_src, size * sizeof(Color_BGR)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } cudaStatus = cudaMalloc((void**)&dev_ret, size * sizeof(float)); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMalloc failed!"); goto Error; } // Copy input vectors from host memory to GPU buffers. cudaStatus = cudaMemcpy(dev_src, src, size * sizeof(Color_BGR), cudaMemcpyHostToDevice); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; } FindColorCudaKernel <<>> (dev_src,dev_ret,target); // Check for any errors launching the kernel cudaStatus = cudaGetLastError(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "FindColorCuda launch failed: %s\n", cudaGetErrorString(cudaStatus)); goto Error; } // cudaDeviceSynchronize waits for the kernel to finish, and returns // any errors encountered during the launch. cudaStatus = cudaDeviceSynchronize(); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus); goto Error; } cudaStatus = cudaMemcpy( ret, dev_ret, size * sizeof(float), cudaMemcpyDeviceToHost); if (cudaStatus != cudaSuccess) { fprintf(stderr, "cudaMemcpy failed!"); goto Error; }Error: cudaFree(dev_ret); cudaFree(dev_src); return cudaStatus;}
在4060 LapTop 上取得 8ms(1024*1024)的成绩
关键词:
一种基于DeltaE(CIE 1976)的找色算法Cuda实现_即时看
世界通讯!复苏中的中国经济怎么看?2023上财宏观论坛在沪举办
韩国最大在野党:IAEA评估报告未验证福岛核污水安全性
天天动态:卖得太火 魅族20 PRO严重缺货!晨曦紫、曙光银今日开启预定
全球快播:9.99万价格屠夫!长安第二代UNI-T尊享型上市:入门就有骁龙8155
每日速读!小憩、露营、洗车模式上线 岚图梦想家发布OTA2.0版本
奔驰变法拉利!男子107万提新车发现竟是翻新车:退一赔三获赔428万_动态焦点
新资讯:盘点10款最美游戏:《最后生还者》《艾尔登法环》等入选
【AI新趋势期刊#2】AI发明计算机算法,如何给大模型排行,照片秒变二维码,视频一键动漫风 速看
焦点热讯:Java异常分类和常见异常
语音直播源码知识分享:探索新的沟通方式-全球微动态
水深火热成语接龙_热字开头的成语
《巨齿鲨2:深渊》最新预告出炉:杰森·斯坦森、吴京大战海底怪兽
双泵水冷力压13900KS 310W功耗!超频三DE360水冷散热器评测:静音水泵也很重要 即时焦点
头条焦点:华裔学者出手!50年零进展算法难题被突破
不顾国内外强烈反对!日本拟最早8月核污水排海|当前观察
环球最资讯丨故宫门票提前7天抢不到 黄牛要价翻6倍!全国博物馆几乎都如此
全球即时看!还分不清bin log 、redo log 跟 undo log?
全球快讯:前端Vue一款基于canvas的精美商品海报生成组件 根据个性化数据生成商品海报图 长按保存图片
世界简讯:突发!俄军一架战机坠毁
【天天速看料】火狐发布115版本更新:支持Win7/8最后版本
天天微资讯!女子半夜拍蚊子走出158步吓坏母亲:通过微信步数了解家人起居
男孩被锁车内父母心疼玻璃不愿砸 路人做好事反被责怪:网友看怒|热资讯
焦点热讯:比亚迪豪掷45亿巴西建三厂:年产15万辆、提供超5000个就业岗位
实时:西安饭庄长安礼记糕点礼盒大促:原价69.9 西安19.9包邮
【天天时快讯】法国总统马克龙:骚乱顶峰已过去 仍需保持警惕
债市开放新消息:离岸国债期货呼之欲出
环球快播:胡昌升会见俞敏洪一行
宁德时代科学家欧洲拿发明大奖!开发带盖的锂电池降低爆炸风险
全球微速讯:中国新能源汽车6月销量达到历史最高水平:比亚迪、特斯拉均创新高
广东一奥迪车嚣张 逆行还竖中指车主已被查处 大快人心
苹果打鸡血 电池激增!消息称iPhone 15系列存储加大 告别128GB 环球快报
《英雄联盟》LPL夏季赛TT战胜EDG:Uzi复出斩获第七次MVP_环球新动态
多省份上调最低工资标准,安徽等15省份第一档月最低工资超2000元 今日热文
在CentOS 7 mini版中使用ifconfig
世界球精选!年内券商债券承销金额超6万亿元 部分中小券商在不同类型债券承销方面展现出优势
医保谈判药品怎么续约?非独家药品如何竞价?国家医保局公开征求意见 环球快看
成都滴滴公司要注销?官方回应:非运营主体 公司一切正常 世界热门
3999元起口碑超稳!小米13官网评价超100万:99.9%好评率 全球新消息
没人买?RTX 4060大降价 降速让人惊叹:英伟达要出手了
杀入BBA腹地 30多万的比亚迪照样卖爆:腾势N7上市24小时大定11687辆
读发布!设计与部署稳定的分布式系统(第2版)笔记19_基础层之设备 环球讯息
俄外交部:目前没有理由延长黑海港口农产品外运协议-天天观点
重制版或将在今年8月公开,R星已找到作者联系
小米“掐架”华为!发起专利无效请求:到底发生了什么? 热门看点
阿里的AIGC数据库工具: Chat2DB的学习与使用
环球消息!国产汽水 凭啥喝不出一家上市企业
环球热头条丨为什么人类尾巴进化掉了?留下来不行吗?中国科学家新发现
四川惊现“蚊卷风” 大量蚊子聚集5米高?想干嘛?
全球报道:本来想用AI来打败AI:结果惨烈翻车
资讯推荐:深圳市监局回应山姆泡面桶被炒至1999元:没有恶意加价
每日速递:古代20岁到100岁的称呼(20岁到70岁在古代分别叫什么)
行使国家立法权的机关是人民代表大会_全国人民代表大会和行使国家立法权
【天天新视野】ons游戏该死的妹子官方(ons游戏该死的妹子)
文心一言 VS 讯飞星火 VS chatgpt (54)-- 算法导论6.2 6题
卖了一个多月后 RTX 4060 Ti太尴尬了:Steam玩家零人购
速看:你买的手机到底是不是正品?这么一查 全清楚了
16针供电口有毒!RTX 4090配90度拐弯电源线后:照烧不误
每日热门:一天吃透操作系统面试八股文
Linux raid-磁盘阵列-raid10搭建 今头条
热议:做个有出息的女姟_做个有出息的女孩
绝地求生大逃杀什么时候出的?绝地求生大逃杀按什么键说话?
藤蔓的拼音是什么?藤蔓的寓意和象征是什么?
身份证号码代表哪些信息?实名认证身份证号码的正确格式是什么?
iPhone 15全系电池容量曝光!续航稳了:只差一步就5000mAh|每日信息
到三份寿司只要12.9元:剩菜盲盒你会去购买吗? 全球要闻
电信手机积分是怎么来的?电信的手机积分怎么兑换话费?
如果的事原唱是谁?如果的事表达的是什么意思?
知名电动自行车品牌Urtopia推出新品 将ChatGPT融入其中
海南三亚一男子偷偷潜入别墅并喝掉主人的6瓶茅台 家政发现并报警
德国著名网红健身博主“拉丝哥”猝死离世 因硬货较多导致粉丝数量破千万
西安一母女在大雁塔内推开保护罩伸手触摸石刻 遭到网友唾弃
“广东人正式被确诊为依萍”登上热搜 今夏暴雨将增多
导致白癜风复发的因素有哪些呢 世界视点
焦点速递!拍3件39元到手!舒蕾参姜控油防断修护洗发水狂促(78元优惠券)
速看:全新阿尔法·罗密欧朱丽叶上市!售35.98万元起 买它还是宝马3系?
一图看懂iQOO 11S:首发超算独显、顶配1TB 4799元
最强天玑平板!iQOO Pad新配色发布:2399元起步 性能直接拉满-热点聚焦
泰坦号乘客的最后时刻:听音乐沉入海底 官方称比过马路更安全|天天时讯
【当前热闻】架构师常用的设计图
环球今头条!C#百度地图开放平台211sn校验失败解决方法
为什么是我为什么不是我作文指导(为什么是我)
矿难后矿卡公司神转型:3.8万张显卡打包提供AI算力 天天观速讯
“最像人”的机器人学会绘画:Ameca接入GPT-3生成式AI模型|全球快讯
焦点日报:安卓充电卷王 iQOO 11S要普及200W快充:放心用4年
观速讯丨立省231块!361度板鞋男新款休闲鞋大促:69元包邮到手
苹果回应Mac彻底抛弃Intel:给过机会 可处理器真没法用 世界滚动
记录--组件库的 Table 组件表头表体是如何实现同步滚动?|每日时讯
2023容器网络趋势:CNI网络插件逐渐普及,Kube-OVN受欢迎度持续攀升 今日最新
环球微动态丨手机刷了PE类原生系统后的体验
环球即时看!债市日报:7月4日
【聚看点】车评人怒批埃尔法不装防撞梁:一老板出车祸 后排都变形了
00后发明全新上班方式!谁说电动轮椅只适合老年人 天天快播报
比亚迪腾势N7正式上市 售价30.18万起 特斯拉Model Y还香吗
2023果冻行业市场现状分析-天天观速讯
每日消息!java基础之行为抽象
天天热资讯!华为云河图KooMap 共筑数字孪生底座 共建产业标杆
环球看热讯:商品日报(7月4日):纸浆刷新逾两个月新高 双焦走弱焦煤跌近3%
【播资讯】高温之下 导游及游客安全更要上心
大模型中的“罗翔” 北大团队发布法律大模型ChatLaw-天天快资讯