0

我编写了一个程序,该程序将图片作为输入并检测我需要编辑我的程序以添加另外两个功能的书面文本

首先,因为我已经能够获得轮廓坐标(完成),我想知道如何获得围绕每个字符轮廓线的背景颜色(在多个点,因为我想计算 RGB 颜色的平均值围绕该字符的值)我只是不知道是否已经有一个函数可以做我想做的事情,或者是否有我应该遵循的特定方法

其次,我试图填充轮廓的内部,但它没有用,有人可以帮助我知道为什么我在我的 cv2.drawContours 中同时尝试了厚度 = -1 和厚度 = cv2.FILLE,没有任何效果,显然只有控制线是蓝色的,但里面不是蓝色的

我知道代码并不完美,并且有很多评论,但这是因为我正在尝试新的东西,在此先感谢所有愿意提供帮助的人

import cv2
import pytesseract
import numpy as np
from PIL import ImageGrab
import pyautogui
def Contour(img):
    Contours,hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    for cnt in Contours:
        area = cv2.contourArea(cnt)
        # print(area)
        # if area<150: could be useded to be cpecific
        # we need a copy of the image so we dont draw on the original or thickness=-1
        cv2.drawContours(imgcpy, cnt, -1, (255,0,0), thickness=-1)

#pytesseract.pytesseract.tesseract_cmd= 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
cap= cv2
img = cv2.imread('D:\\opencv\\R\\img\\lec\\3.png')
imgcpy = img.copy()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# for japanese txt = pytesseract.image_to_string(gray, lang='jpn')
txt = pytesseract.image_to_string(gray)

imgblur = cv2.GaussianBlur(img, (7, 7), 0)
imgcanny = cv2.Canny(img, 200, 200)
#imgDialation = cv2.dilate(imgcanny, kernel, iterations=1)
#imgeroded = cv2.erode(imgDialation, kernel, iterations=1)
imBlank = np.zeros_like(img)
# waste of time only the same picture work -_-
# imstack = np.hstack((gray,gray,gray))
Contour(imgcanny)
cv2.imshow('Contour', imgcpy)



#img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print(txt)

print(Contour(imgcanny))
#cv2.imshow('test', img)
cv2.waitKey()

在此处输入图像描述

4

1 回答 1

0

“第一个”问题通过以下方式解决

  1. 得到一个面具,要么
    • 使用connectedComponents
    • drawContours通过使用into填充掩码np.zeros((height, width), dtype=np.uint8)
  2. dilate面具,然后
  3. 从扩张的版本中减去掩码(字面减法会起作用,但按位运算也是如此)

结果是一个包含轮廓外像素的掩码。

使用此掩码获取这些像素值:

# have `mask` somehow, which should be dtype uint8

dilated = cv.dilate(mask)
surrounding = dilated - mask

values = img[surrounding != 0] # numpy indexing using a boolean array
meancolor = values.mean(axis=(0,1)) # sum/average over both axes

“第二个”问题是您将单个轮廓传递给drawContours,它需要一个轮廓列表

更改您的代码以通过[cnt],而不仅仅是cnt

cv2.drawContours(imgcpy, [cnt], -1, (255,0,0), thickness=-1)

如果您只通过cnt,它会将列表(轮廓是点列表)解释为轮廓列表,因此它将每个点解释为轮廓......这只是一个点,而不是轮廓。

于 2021-10-06T13:36:49.623 回答