首页 > 编程问答 >使用五彩背景更改聊天屏幕截图的背景颜色

使用五彩背景更改聊天屏幕截图的背景颜色

时间:2024-07-20 21:31:15浏览次数:11  
标签:python python-3.x opencv redaction

我有一个从聊天平台截取的屏幕截图,想要将聊天背景更改为白色,包括参与者的个人资料图片。如果屏幕截图中未显示聊天组的名称,则此 问题 中的代码可以正常工作。图 1 是原始图像的示例,图 2 是迄今为止取得的结果: image1

image2

并且我想要实现类似于图 3 的效果:

image3

这是我在问题中使用的代码:

import cv2
import numpy as np

filename = ("/Users/user/Desktop/test2.png")

image = cv2.imread(filename)

hsv_img = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)  # rgb to hsv color space

s_ch = hsv_img[:, :, 1]  # Get the saturation channel

thesh = cv2.threshold(s_ch, 5, 255, cv2.THRESH_BINARY)[1]  # Apply threshold - pixels 
above 5 are going to be 255, other are zeros.
thesh = cv2.morphologyEx(thesh, cv2.MORPH_OPEN, 
cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7)))  # Apply opening morphological 
operation for removing artifacts.

cv2.floodFill(thesh, None, seedPoint=(0, 0), newVal=128, loDiff=1, upDiff=1)  # Fill 
the background in thesh with the value 128 (pixel in the foreground stays 0.

image[thesh == 128] = (255, 255, 255)  # Set all the pixels where thesh=128 to white.

cv2.imwrite('Filtering1.jpg', image)  # Save the output image.

我对此很陌生,所以我需要知道应该在代码中添加/更改什么才能实现图 3 中的结果。


提供代码的主要问题在于,它依赖于饱和度通道的阈值来创建掩码,但这对于的输入图像并不可靠,因为聊天气泡本身也有一些低饱和度的颜色。

以下是一种更好的方法,可以使用轮廓检测和洪水填充来实现目标:

import cv2
import numpy as np

# 加载图片
image = cv2.imread("your_image.jpg") 
# 将图片转换为灰度
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用二值化处理灰度图
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)[1]

# 查找轮廓
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# 创建一个掩码,并将所有像素设置为黑色
mask = np.zeros_like(image)

# 迭代所有轮廓
for c in cnts:
    # 计算轮廓的面积
    area = cv2.contourArea(c)
    # 如果面积大于某个阈值(这里设置为1000),则认为是聊天气泡
    if area > 1000:
        # 绘制填充的轮廓到掩码
        cv2.drawContours(mask, [c], -1, (255, 255, 255), -1)

# 对掩码进行膨胀操作,以确保覆盖聊天气泡的边缘
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
mask = cv2.dilate(mask, kernel, iterations = 1)

# 将掩码转换为灰度
mask_gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

# 在掩码上进行洪水填充,从图片的左上角开始
h, w = image.shape[:2]
cv2.floodFill(mask_gray, None, (0, 0), 255)

# 反转掩码,以便聊天气泡区域为黑色,背景为白色
mask_inv = cv2.bitwise_not(mask_gray)

# 将原始图片中聊天气泡区域的像素设置为白色
image[mask_inv == 255] = (255, 255, 255)

# 保存结果图片
cv2.imwrite("result.jpg", image)

这段代码首先将图像转换为灰度,然后进行二值化处理。 接下来,它会找到图像中的所有轮廓。对于每个轮廓,它会计算其面积,如果面积足够大,则将其视为聊天气泡,并将其绘制到掩码上。

然后,代码会对掩码进行膨胀操作,以确保覆盖聊天气泡的边缘。 接下来,它会使用洪水填充算法将掩码外部的所有区域填充为白色。 最后,它会反转掩码,并将原始图像中对应于掩码中白色区域的像素设置为白色。

请注意,可能需要根据的输入图像调整代码中的某些参数,例如阈值和膨胀操作的内核大小。

标签:python,python-3.x,opencv,redaction
From: 78772902

相关文章

  • Python学习笔记41:游戏篇之外星人入侵(二)
    前言在上一篇文章,我们已经创建好了项目目录,在今天,我们主要编写入口模块的功能。mainmain.py模块是我们游戏程序的入口,所有我们需要在模块中编写游戏主启动以及主页面相关的代码。当前我们的main模块是这样的,这是我们创建项目时默认生成一些代码,接下来我们就要进行我们......
  • Python学习笔记39:进阶篇(二十八)pygame的使用之按键映射及按键失效问题解决
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记40:游戏篇之外星人入侵(一)
    前言入门知识已经学完,常用标准库也了解了,pygame入门知识也学了,那么开始尝试小游戏的开发。当然这个小游戏属于比较简单的小游戏,复杂的游戏需要长时间的编写累计开发经验,同时也需要一定的时间才能编写出来。现在的话还是嫩了点。从基础的简单的开始,学习实践,慢慢的成长才......
  • Python学习笔记37:进阶篇(二十六)pygame的使用之输入处理
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • Python学习笔记38:进阶篇(二十七)pygame的使用之时间与帧数控制
    前言基础模块的知识通过这么长时间的学习已经有所了解,更加深入的话需要通过完成各种项目,在这个过程中逐渐学习,成长。我们的下一步目标是完成pythoncrashcourse中的外星人入侵项目,这是一个2D游戏项目。在这之前,我们先简单学习一下pygame模块。私信我发送消息python资料,......
  • 音频文件降噪及python示例
    操作系统:Windows10_x64Python版本:3.9.2noisereduce版本:3.0.2从事音频相关工作,大概率会碰到降噪问题,今天整理下之前学习音频文件降噪的笔记,并提供Audacity和python示例。我将从以下几个方面展开:noisereduce库介绍使用Audacity进行降噪使用fft滤波降噪使用noisereduce进......
  • Python; Django 添加字符到路径名导致操作系统错误 22
    我一直在尝试让django渲染我创建的模板。起初它说模板不存在,但是一旦我修复了错误,它现在就会向路径添加字符,并且因此找不到模板。路径应该是:C:\\Users\\ABC\\Desktop\\science_crowd\\Lightweight_Django\\placeholder\\home.html但是错误说:它找不到:C:\\Us......
  • 如何在 IPython 控制台中显示 conda 环境名称?
    上下文我想在Spyder的IPython控制台中显示conda环境名称,这样我就知道我正在运行哪个环境。虽然此信息在状态栏中可用,但有时只是显示|||而不是实际的环境名称:conda我尝试过的在启动时打印它Spyder允许在控制台启动时运行代码。但是,似乎......
  • Python 中更快的套接字
    我有一个用Python编写的服务器客户端,它通过LAN运行。该算法的某些部分密集使用套接字读取,其执行速度比用C++编写的几乎相同的慢3-6倍。有哪些解决方案可以使Python套接字读取速度更快?我实现了一些简单的缓冲,我的用于处理套接字的类如下所示:P.S.:分析还显示......
  • .py文件是python脚本吗
    .py文件是python的脚本文件。Python在执行时,首先会将.py文件中的源代码编译成Python的bytecode(字节码),然后再由PythonVirtualMachine(Python虚拟机)来执行这些编译好的bytecode。这种机制的基本思想跟Java,.NET是一致的。然而,PythonVirtualMachine与Java或.NET的Virtual......