对于png透明图片,在QQ,贴吧等平台上,看缩略图时默认是以白色为背景,而点开看原图时默认是以黑色为背景,基于此显示逻辑可以实现一种图像,看缩略图时是表图,看原图时是里图,这就是幻影坦克。

基于图像线性融合原理,公式:g(x)=α*f(x)+(1-α)h(x),可以假设最后生成图与白色叠加得到表图,最后生成图与黑色叠加得到里图,套用公式即可得到幻影坦克的理论公式:

公式和原理都源自B站视频,BV1kV411v7fR,讲的很细致。

需要注意的是,公式里α透明度有一项是表图的灰度值减里图灰度值,必须保证这个值时刻大于0,不然会出现α值大于255的情况,造成错误,即里图显示时出现表图部分,如图:

在我把背景换成橙色以后,图中错误部分也显示为橙色,所以判断为这些地方透明度计算出现问题。

经过初步分析得到:显示错误的地方在原图中的灰度值非常低,导致P表-P里小于0,使α超出上限,造成完全透明。

如何保证P表-P里大于0?我的想法是里图调暗一些,最后保证表图每一像素的灰度大于里图灰度即可。

经过一段时间的调试,我得到了我的解决办法:以里图尺寸为基准,遍历全部像素点,分别读取表图和里图的灰度,将读取到的里图灰度乘0.35,灰度的范围是0-255,因此最大值255*0.35=89.25。对于表图的灰度,如果出现小于上面这个值的灰度,就给他强行赋值为100,这样一定能够保证P表-P里大于0,α正常,里图显示正常。

可能会有人问:改变了表图灰度,会不会对最终结果造成影响?这个问题我还不清楚,但是根据生成的幻影坦克来看,这点影响可以忽略不计。

希望大神指点更好的方法以保证α不出问题。

最后附上源码

#include<opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;int main()
{Mat A_origin = imread("A.jpg", 0);Mat A;Mat B = imread("B.jpg",0);   resize(A_origin, A, B.size());              //以里图尺寸resize表图Mat C = Mat::zeros(B.size(), CV_8UC4);      //以里图尺寸为基础创建新图int PA, PB, PC;int Alpha;for (int i = 0; i < B.rows; i++){for (int j = 0; j < B.cols; j++){PA = (int)A.at<uchar>(i, j);PB = ((int)B.at<uchar>(i, j)) * 0.35;if (PA < 100)                    //解决问题的关键{PA = 100;}Alpha = 255 - (PA - PB);      if (Alpha == 0)                   {Alpha = 1;}PC = (int)(255 * PB / Alpha);C.at<Vec4b>(i, j) = Vec4b(PC, PC, PC, Alpha);}}imwrite("Mirage Tank.png", C);}

基于OpenCV实现的灰度图幻影坦克相关推荐

  1. opencv遍历实现灰度图转伪彩色图[C/C++][附applyColorMap方法]

    灰度图转伪彩色图 数字图像处理的作业,利用opencv实现通过灰度隐射将灰度图转化为伪彩色图. 效果大概如下,在最后附带opencv自带函数处理的方法 原图 遍历图 opencv的 applyColo ...

  2. OpenCV调用摄像头+灰度图+高斯滤波+Canny算子

    来把opencv经常要用的一些函数来梳理一下 效果图震楼 惯例opencv配置环境地址:https://blog.csdn.net/aidam_bo/article/details/81132918 ...

  3. [Python图像处理] 十四.基于OpenCV和像素处理的图像灰度化处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  4. Matlab与C/C++混合编程 (基于Opencv库)

    之前用过基于VS2018 与MATLAB2018a 混合编程(C++特性)(见https://blog.csdn.net/wwwoowww/article/details/83013801),奈何后来 ...

  5. 一组基于OpenCV的图像处理函数

    本文在根据 Getting Started with OpenCV 给出的对于OpenCV使用介绍进行整理,以备之后的学习和工程应用.   下面给出了一系列的对于小白应用OpenCV进行初步指导的博文 ...

  6. Python使用openCV把原始彩色图像转化为灰度图、使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本)、基于自适应阈值预处理(adaptive thresholding)方法

    Python使用openCV把原始彩色图像转化为灰度图.使用OpenCV把图像二值化(仅仅包含黑色和白色的简化版本).基于自适应阈值预处理(adaptive thresholding)方法 目录

  7. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  8. python彩虹图_灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

    做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨. 本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!! 废话不说了,代码是码农 ...

  9. matlab灰度图转伪彩色,[转载]灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

    做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨. 本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!! 废话不说了,代码是码农 ...

最新文章

  1. Open XML 已成为ISO标准
  2. 零基础自学html5要多久?Web前端学习路线的6点建议
  3. 【LeetCode】剑指 Offer 60. n个骰子的点数
  4. 企业付款php 接口,微信企业付款接口PHP开发需要注意的两个地方
  5. 虚拟 IP原理(动态 IP 、固定 IP 、实体 IP)
  6. 一起来作画吧「GitHub 热点速览 v.22.14」
  7. Ansible 运维自动化 ( 配置管理工具 )
  8. Linux tar命令无法执行,Linux执行tar解压报错tar: Error is not recoverable: exiting now
  9. Android图片颜色混合算法
  10. C#:实现Zhang Suen细化算法(附完整源码)
  11. lc滤波电路电感电容值选择_几种常见的无源滤波电路
  12. 世界上最好的图片无损压缩软件
  13. windows_server2008操作系统切换语言
  14. 【Java】微信企业付款报错:java.io.IOException: toDerInputStream rejects tag type 45
  15. “博客无双”第二期拍卖活动将于2011年1月26日14:00开始
  16. “2019·中国云计算和物联网大会”来袭,多个亮点
  17. ubuntu c语言调用串口,ubuntu 下使用串口工具(呕心沥血整理调试成功)
  18. win10 下安装 neo4j
  19. 游戏本天梯_实况足球手游国服5月天梯胜率榜+极品补丁一枚
  20. 深度学习与人类语言处理学习笔记(一)—— 语音识别(理论篇)

热门文章

  1. 去中心化金融项目 Bloqboard FAQ
  2. 制作Linux的优盘(usb)启动盘
  3. nginx和ftp搭建图片服务器
  4. 【C++】C++基础语法
  5. python3自动下载优酷视频小程序
  6. 怎么将Excel多个工作表拆分成多个单独的Excel
  7. 日常小工具向excel中批量添加图片和图片名称
  8. 程序员持续记录开始赚钱之旅 (第二十一篇)
  9. 解决ctrl+win+left/right失效问题(windows10桌面切换快捷键)
  10. VLDB2021会议论文列表(可下载)