Python 检测颜色并从图像中删除该颜色
我有一个背景是浅紫色的图像,角色是深蓝色的。我的目标是从图像中识别文本。所以我试图从背景中去除浅紫色,这样我的图像就不会有噪音,但我找不到图像的确切颜色代码,因为它在任何地方都有些不同,所以我无法遮罩图像。这是我的密码Python 检测颜色并从图像中删除该颜色,python,image,image-processing,captcha,color-picker,Python,Image,Image Processing,Captcha,Color Picker,我有一个背景是浅紫色的图像,角色是深蓝色的。我的目标是从图像中识别文本。所以我试图从背景中去除浅紫色,这样我的图像就不会有噪音,但我找不到图像的确切颜色代码,因为它在任何地方都有些不同,所以我无法遮罩图像。这是我的密码 import numpy as np from PIL import Image im = Image.open('capture.png') im = im.convert('RGBA') data = np.array(im) rgb = data[:,:,:3] co
import numpy as np
from PIL import Image
im = Image.open('capture.png')
im = im.convert('RGBA')
data = np.array(im)
rgb = data[:,:,:3]
color = [27, 49, 89] # Original value to be mask
black = [0,0,0, 255]
white = [255,255,255,255]
mask = np.all(rgb == color, axis = -1)
data[mask] = black
data[np.logical_not(mask)] = white
new_im = Image.fromarray(data)
new_im.save('new_file.png')
所以我想,如果我能去除所有特定颜色范围内的颜色,比如[R:0-20,G:0-20,B:80-100],也许这会奏效。有人能告诉我怎么做吗
对于解决此问题的任何其他建议,我们也将不胜感激。这里是一种使用像素阵列的方法。像素阵列速度很慢,但如果速度不是问题,它们可以满足您的需要,而无需下载任何外部库。此外,像素阵列很容易理解
import pygame
# -- You would load your image as a sprite here. --
# -- But let's create a demonstration sprite instead.--
#
usecolor = (46,12,187,255) # Declare an example color.
sprite = pygame.Surface((10,10)) # Greate a surface. Let us call it a 'sprite'.
sprite.fill(usecolor) # Fill the 'sprite' with our chosen color.
#
# -- Now process the image. --
array = pygame.PixelArray(sprite) # Create a pixel array of the sprite, locking the sprite.
sample = array[5,5] # Sample the integer holding the color values of pixel [5,5]
# We will feed this integer to pygame.Color()
sample_1 = sprite.get_at((5,5)) # Alternately, we can use the .get_at() method.
# Do the same for every pixel, creating a list (an array) of color values.
del array # Then delete the pixel array, unlocking the sprite.
m,r,g,b = pygame.Color(sample) # Note: m is for the alpha value (not used by .Color())
print("\n sample =",sample,"decoded by python.Color() to:")
print(" r >>",r)
print(" g >>",g)
print(" b >>",b)
print("\n or we could use .get_at()")
print(" sample_1 =",sample_1)
print()
exit()
只需测试每个r、g、b值,看看它们是否在每个颜色分量的期望范围内。然后将每个像素复制到新曲面上,用所需的替换颜色替换范围内的所有颜色
或者,在将像素放入新图像之前,可以向每个R、G、B颜色分量(如果颜色>255:color=255)添加75。这会使所有颜色逐渐变为白色,直到浅色消失。然后,您可以重复从每个剩余像素(组件值小于255)中减去75的过程,以使颜色再次向前。我怀疑任何一个像样的验证码都是如此容易被击败,但这就是问题所在
好玩 因为文本和背景似乎有一个可区分的阴影,所以颜色阈值应该在这里工作。其思想是将图像转换为HSV格式,然后使用上下限阈值生成二进制分段掩码,然后按位提取文本。下面是一个使用Python OpenCV的实现
利用这个下限和上限阈值,我们得到了这个掩模
lower = np.array([0, 120, 0])
upper = np.array([179, 255, 255])
然后,我们对原始图像按位和
最后通过阈值分割得到前景文本为黑色,背景为白色的二值图像
您可以使用此HSV颜色阈值脚本来确定下限和上限阈值
好像你想入侵一个网站?如果你不知道为什么你想得到你已经拥有的信息?@user1438644 lol no,这是我的学校深度学习课程项目。大多数情况下,你可以使用其中一个通道设置图像阈值,但如果不看到图像,很难推荐一种方法-志愿者如何帮助你再现你的问题?为什么要拍摄一张图像并将其转换为4个通道,然后拍摄前3个通道?为什么不先用
im=Image将其转换为3个频道。打开(…)。转换(“RGB”)
?请添加您的图像。谢谢你,它工作得很好。非常感谢你,你是天才我能把黑白图像转换成黑白吗?喜欢白色背景和黑色text@VIBHUBAROT,将图像转换为灰度,然后使用cv2.bitwise_not()
或image=255-image
我想您正在寻找图像阈值,请检查更新
import numpy as np
import cv2
# Color threshold
image = cv2.imread('1.png')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 120, 0])
upper = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(original,original,mask=mask)
result[mask==0] = (255,255,255)
# Make text black and foreground white
result = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
result = cv2.threshold(result, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()
import cv2
import sys
import numpy as np
def nothing(x):
pass
# Load in image
image = cv2.imread('1.png')
# Create a window
cv2.namedWindow('image')
# create trackbars for color change
cv2.createTrackbar('HMin','image',0,179,nothing) # Hue is from 0-179 for Opencv
cv2.createTrackbar('SMin','image',0,255,nothing)
cv2.createTrackbar('VMin','image',0,255,nothing)
cv2.createTrackbar('HMax','image',0,179,nothing)
cv2.createTrackbar('SMax','image',0,255,nothing)
cv2.createTrackbar('VMax','image',0,255,nothing)
# Set default value for MAX HSV trackbars.
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)
# Initialize to check if HSV min/max value changes
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0
output = image
wait_time = 33
while(1):
# get current positions of all trackbars
hMin = cv2.getTrackbarPos('HMin','image')
sMin = cv2.getTrackbarPos('SMin','image')
vMin = cv2.getTrackbarPos('VMin','image')
hMax = cv2.getTrackbarPos('HMax','image')
sMax = cv2.getTrackbarPos('SMax','image')
vMax = cv2.getTrackbarPos('VMax','image')
# Set minimum and max HSV values to display
lower = np.array([hMin, sMin, vMin])
upper = np.array([hMax, sMax, vMax])
# Create HSV Image and threshold into a range.
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower, upper)
output = cv2.bitwise_and(image,image, mask= mask)
# Print if there is a change in HSV value
if( (phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
phMin = hMin
psMin = sMin
pvMin = vMin
phMax = hMax
psMax = sMax
pvMax = vMax
# Display output image
cv2.imshow('image',output)
# Wait longer to prevent freeze for videos.
if cv2.waitKey(wait_time) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()