Python 从与文字内容颜色相同的图像中删除背景

Python 从与文字内容颜色相同的图像中删除背景,python,opencv,image-processing,Python,Opencv,Image Processing,我需要直接从我的网络摄像头处理车牌图像,使用python和它的OpenCV库 目前我已经达到了可以单独识别车牌字符的程度,但我仍然需要从图像中删除背景 此背景与字符的颜色相同,因此颜色过滤器工作不太好。 除此之外,我的图像还需要一些调整和清理,我的阈值形态学改变无法处理 我当前的图片如下: 我需要实现以下最终结果: 我现在已经完成了这几行代码,但由于我的努力、参数修改和应用的过滤器,我仍然无法实现我的目标 import cv2 cv2.imread("plate_from_web

我需要直接从我的网络摄像头处理车牌图像,使用python和它的OpenCV库

目前我已经达到了可以单独识别车牌字符的程度,但我仍然需要从图像中删除背景

此背景与字符的颜色相同,因此颜色过滤器工作不太好。 除此之外,我的图像还需要一些调整和清理,我的阈值形态学改变无法处理

我当前的图片如下:

我需要实现以下最终结果:

我现在已经完成了这几行代码,但由于我的努力、参数修改和应用的过滤器,我仍然无法实现我的目标

import cv2

cv2.imread("plate_from_webcam.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
(thresh, imgPB) = cv2.threshold(img, 156, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 2))
imgPB = cv2.morphologyEx(imgPB, cv2.MORPH_OPEN, kernel)
imgRoi = imgPB[y:y + h, x:x + w]
cv2.imshow("ROI", imgRoi)

要达到预期的效果,下一步应该做什么?

这里是Python/OpenCV中的一种方法

  • 读取输入
  • 剃掉周围3个像素以去除白色边框
  • 将3个黑色像素加上10个黑色像素作为形态学的缓冲区,因为白色区域靠近图像的上边缘
  • 变灰
  • 门槛
  • 将形态学应用于去除小的黑色区域
  • 寻找轮廓
  • 在黑色背景上绘制一个白色填充轮廓,作为最大轮廓的遮罩
  • 使用遮罩将阈值图像的外部黑色区域涂成白色
  • 保存结果

输入:


阈值图像(形态学处理后):

遮罩图像:

结果图像:


在Python/OpenCV中有一种方法

  • 读取输入
  • 剃掉周围3个像素以去除白色边框
  • 将3个黑色像素加上10个黑色像素作为形态学的缓冲区,因为白色区域靠近图像的上边缘
  • 变灰
  • 门槛
  • 将形态学应用于去除小的黑色区域
  • 寻找轮廓
  • 在黑色背景上绘制一个白色填充轮廓,作为最大轮廓的遮罩
  • 使用遮罩将阈值图像的外部黑色区域涂成白色
  • 保存结果

输入:


阈值图像(形态学处理后):

遮罩图像:

结果图像:


这真是一种很酷的方法。我修改了流程,自动使用我最后生成的图像(防止再次保存和打开它),但最终这是一个非常酷的结果!如果我只需要对角色进行DINAMICALL裁剪,下一步该怎么做?从侧面去除一些白色区域。倒置,使字母为白色,背景为黑色。然后得到每个字母的外部轮廓。然后获取它们的边界框,并将其与numpy一起使用,以裁剪每个字母,这是一种非常酷的方法。我修改了流程,自动使用我最后生成的图像(防止再次保存和打开它),但最终这是一个非常酷的结果!如果我只需要对角色进行DINAMICALL裁剪,下一步该怎么做?从侧面去除一些白色区域。倒置,使字母为白色,背景为黑色。然后得到每个字母的外部轮廓。然后获取它们的边界框,并将其与numpy一起用于裁剪每个字母
import cv2
import numpy as np

# read image
img = cv2.imread("license2.png")
hh, ww = img.shape[:2]

# shave off 3 pixels all around to remove outer white border
img = img[3:hh-3, 3:ww-3]

# pad 3 black pixels back all around plus another 10 all around as buffer for later morphology
img = cv2.copyMakeBorder(img, 13,13,13,13, cv2.BORDER_CONSTANT, (0,0,0))

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

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

# apply morphology to remove small black spots
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7,7))
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
hh2, ww2 = thresh.shape[:2]

# shave off 10 pixels all around
thresh = thresh[10:hh2-10, 10:ww2-10]

# get largest outer contour
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
big_contour = max(cnts, key=cv2.contourArea)

# draw filled contour on black background
mask = np.zeros_like(thresh)
cv2.drawContours(mask, [big_contour], -1, (255), cv2.FILLED)

# use mask to make outside of thresholded license into white
# put white in result where mask is black
result = thresh.copy()
result[mask == 0] = 255

# write results
cv2.imwrite("license2_thresh.png", thresh)
cv2.imwrite("license2_mask.png", mask)
cv2.imwrite("license2_result.png", result)

# display it
cv2.imshow("thresh", thresh)
cv2.imshow("mask", mask)
cv2.imshow("result", result)
cv2.waitKey(0)