Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从图像中删除颜色以仅保留文本_Python_Image_Numpy_Colors_Python Imaging Library - Fatal编程技术网

Python 从图像中删除颜色以仅保留文本

Python 从图像中删除颜色以仅保留文本,python,image,numpy,colors,python-imaging-library,Python,Image,Numpy,Colors,Python Imaging Library,如下图所示的白色背景图像,一些文本在红色背景下为黑色,一些文本为红色。文本的位置无论是否有背景都是不固定的 我想复制一个只有文本的图像 我想到的一种方法是将红色背景换成白色,但红色文本不可避免地也会消失 以下是我尝试过的: from PIL import Image import numpy as np orig_color = (255,0,0) replacement_color = (255,255,255) img = Image.open("C:\\TEM\\AB.png").co

如下图所示的白色背景图像,一些文本在红色背景下为黑色,一些文本为红色。文本的位置无论是否有背景都是不固定的

我想复制一个只有文本的图像

我想到的一种方法是将红色背景换成白色,但红色文本不可避免地也会消失

以下是我尝试过的:

from PIL import Image

import numpy as np

orig_color = (255,0,0)
replacement_color = (255,255,255)
img = Image.open("C:\\TEM\\AB.png").convert('RGB')
data = np.array(img)
data[(data == orig_color).all(axis = -1)] = replacement_color
img2 = Image.fromarray(data, mode='RGB')
img2.show()
结果如下:

什么是只保存图片所有文本的最佳方法?理想情况如下

多谢各位


以下是我使用OpenCV仅使用图像的红色和绿色通道的方法,有关说明,请参阅代码中的注释:

进口cv2 导入图像 将numpy作为np导入 从图像中提取红色和绿色通道 r、 g=cv2.splitimageio.imread'https://i.stack.imgur.com/bMSzZ.png'[:2] imageio.imsave'r-channel.png',r imageio.imsave'g-channel.png',g 白色图像作为绘制轮廓的画布 画布=np.onesr.shape,np.uint8*255 在反向绿色通道中查找等高线 使用OpenCV 3时,将[0]更改为[1],在OpenCV 3中,等高线将第二次返回 等高线=cv2.findContours255-g,cv2.RETR\u列表,cv2.CHAIN\u近似值\u简单[0] 过滤掉过大且长度为4矩形的轮廓 等高线=[ cnt用于cnt-in轮廓
如果cv2.contourAreacnt始终是黑色和红色的?或者可能有其他颜色吗?@Mark Setchell,它始终是黑色和红色的。获取左上角像素的颜色如何。如果是红色,则将红色像素变为白色,并将假定的黑色字母保留为黑色。如果是黑色,则将黑色像素变为白色,将红色像素变为黑色。此strategy假设您的字母从未接触过角,即左上角的像素是背景色。@MarkSetchell,忘记告诉图像是白色背景。因此左上角的conor是白色的…如果您能检测到包含黑色文本的红色矩形区域,您可以删除该区域周围的红色。然后您可以n将图像中剩余的所有红色文本(即红色文本)替换为黑色。谢谢。当我运行代码时,会出现如下错误,是因为我的cv2版本3.1.0吗?OpenCV错误:断言失败npoints>=0&&depth==CV32f | | depth==CV contourArea中的CV32s,文件C:\builds\master\PackSlaveAddon-win32-vc12-static\OpenCV\modules\imgproc\src\shapedscr.cpp,第314行回溯最后一次调用:文件D:\Python27\script.py,第34行,如果不是cv2.contourAreacnt>500和lencnt==4 cv2.error:C:\builds\master\u PackSlaveAddon-win32-vc12-static\opencv\modules\imgproc\src\shapedscr.cpp:314:error:-215 npoints>=0&&depth==CV=32F | depth==CVntourArea@MarkK是的,我认为这是因为OpenCV 3.1.0。请参见。我使用的是OpenCV 4.1.1。当您将findContours后的[0]更改为[1]时,是否可以测试它是否有效?如果有,我会更新我的答案来解释使用OpenCV 3时的区别。我升级了我的OpenCV,现在你的代码工作得很好。感谢你的分享和帮助!太棒了!你的更新更有效,更通用!感谢你的精彩分享!