当前位置: 首页 > 知识库问答 >
问题:

用纯白色填充图像掩模中的数字

李嘉胜
2023-03-14

我有一个图像与文本在白色背景和另一个我想覆盖这文本上。

我已经计算出了两个图像之间的absdiff值,现在有了一个用于混合这两个图像的掩码。

img1 * mask + img2 * (1-mask)

我的问题是我的文本的轮廓是黑色的,但文本的中心是白色的。但是,也有一些图像的背景是白色的。

我试着让文本的颜色变成浅灰色,并使用NP.Where,但我似乎无法让它发挥作用。

编辑-我有的图像是:

matplotlib中的空白轴(如果需要)

我需要覆盖在条形图上的文本框。(图像要覆盖在上面)

共有1个答案

邓欣可
2023-03-14

下面是使用Python/OpenCV呈现的图像的一种方法。

  • 读取输入
  • 转换为灰色
  • 阈值
  • 查找外部轮廓并在黑色背景上绘制白色填充轮廓
  • 反转阈值
  • 用黑色、白色、黑色填充
  • 查找外部轮廓,并在上一个白色填充轮廓图像上绘制黑色填充轮廓
  • 保存结果

输入:

import cv2
import numpy as np

# read image
img = cv2.imread('1970.png')

# convert gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold saturation image
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]

# get outer contours and draw filled ones as white on black background
cntrs = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]
result1 = np.zeros_like(img)
for c in cntrs:
    cv2.drawContours(result1, [c], 0, (255,255,255), -1)

# invert thresh
thresh2 = 255 - thresh
hh, ww = thresh2.shape

# floodfill thresh2 with black then white then black again
mask = np.zeros([hh + 2, ww + 2], np.uint8)
thresh2 = cv2.floodFill(thresh2, mask, (0,0), 0, 0, 0, flags=8)[1]
mask = np.zeros([hh + 2, ww + 2], np.uint8)
thresh2 = cv2.floodFill(thresh2, mask, (0,0), 255, 0, 0, flags=8)[1]
mask = np.zeros([hh + 2, ww + 2], np.uint8)
thresh2 = cv2.floodFill(thresh2, mask, (0,0), 0, 0, 0, flags=8)[1]

# get outer contours of these holes and draw filled ones as black
cntrs2 = cv2.findContours(thresh2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cntrs2 = cntrs2[0] if len(cntrs2) == 2 else cntrs2[1]
result2 = result1.copy()
for c in cntrs2:
    cv2.drawContours(result2, [c], 0, (0,0,0), -1)

# antialias if desired as follows:

# blur threshold image
result3 = result2.copy()
result3 = cv2.GaussianBlur(result3, (0,0), sigmaX=9, sigmaY=9, borderType = cv2.BORDER_DEFAULT)

# normalize so min=0 and max=255
result3 = cv2.normalize(result3, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

# stretch so that 255 -> 255 and 127.5 -> 0
result3 = skimage.exposure.rescale_intensity(result3, in_range=(127.5,255), out_range=(0,255))  

# save output image
cv2.imwrite('1970_thresh1.png', thresh)
cv2.imwrite('1970_thresh2.png', thresh2)
cv2.imwrite('1970_result1.png', result1)
cv2.imwrite('1970_result2.png', result2)
cv2.imwrite('1970_result3.png', result3)

# display IN and OUT images
cv2.imshow('thresh', thresh)
cv2.imshow('thresh2', thresh2)
cv2.imshow('result1', result1)
cv2.imshow('result2', result2)
cv2.imshow('result3', result3)
cv2.waitKey(0)
cv2.destroyAllWindows()

反锯齿结果:

 类似资料:
  • 我有一个页眉和页脚(),中间有一个。

  • 现在,我尝试执行泛洪填充算法来填充透明的PNG图像,使用文章中的泛洪填充算法如何避免在泛洪填充算法期间超过最大调用堆栈大小?使用非递归方法和Uint32Array很好地处理颜色堆栈。 但是,此整体填充算法保留了未填充的白色(实际上是浅灰色边或抗锯齿边)。这是我的代码: 到目前为止,我已经尝试使用以下建议: 使用matchOutlineColor函数,使用画布中提到的RGBA值-泛光填充在边缘留下白

  • 问题内容: 将SVG输出直接与页面代码内联放置,我能够像这样简单地用CSS修改填充颜色: 这很好用,但是我正在寻找一种方法,当它用作Background-IMAGE时,修改SVG的“填充”属性。 现在如何更改颜色?可能吗 作为参考,这是我的外部SVG文件的内容: 问题答案: 一种方法是从某种服务器端机制为svg提供服务。只需创建一个资源服务器端,即可根据GET参数输出svg,然后将其提供给某个网址

  • 使用下面的代码,我可以在加载到画布中的图像上绘制一个区域,并用一些颜色填充绘制的区域。 现在,我需要用图像而不是颜色填充绘制区域。比如: 帆布fillStyle='url(myimage.jpg)'; 而不是 帆布fillStyle='#123456'//填充颜色示例 HTML: jquery。拉票。min.js

  • 在OpenCV python中,假设我们用cv2.imread读取一个图像,并得到一个BGR numpy数组。接下来我们使用cv2.inrange命令生成一个掩码。掩模具有相同的宽度/高度,并且每个掩模像素要么是黑色的,要么是白色的。 我必须先将掩码转换成BGR图像吗?如果是,怎么做? 编辑:我不想像在将蒙版应用到彩色图像中那样将整个蒙版应用到图像上。另一种表达我所想要的方式:将面具视为一个黑白图

  • 本文向大家介绍Android不规则图像填充颜色小游戏,包括了Android不规则图像填充颜色小游戏的使用技巧和注意事项,需要的朋友参考一下 一、概述 近期群里偶然看到一哥们在群里聊不规则图像填充什么四联通、八联通什么的,就本身好学务实的态度去查阅了相关资料。对于这类着色的资料,最好的就是去搜索些相关app,根据我的观察呢,不规则图像填充在着色游戏里面应用居多,不过大致可以分为两种: 基于层的的填充