小编cof*_*win的帖子

提取边界框并将其另存为图像

假设您有以下图像:例:

现在我想要提取每个独立字母的单个图像,为此任务我已经恢复了轮廓,然后绘制了一个边界框,在这种情况下为角色'a':

角色'a'的边界框

在此之后,我想提取每个框(在这种情况下为字母'a')并将其保存到图像文件中.

预期结果: 结果

到目前为止,这是我的代码:

import numpy as np
import cv2

im = cv2.imread('abcd.png')
im[im == 255] = 1
im[im == 0] = 255
im[im == 1] = 0
im2 = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(im2,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for i in range(0, len(contours)):
    if (i % 2 == 0):
       cnt = contours[i]
       #mask = np.zeros(im2.shape,np.uint8)
       #cv2.drawContours(mask,[cnt],0,255,-1)
       x,y,w,h = cv2.boundingRect(cnt)
       cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
       cv2.imshow('Features', im)
       cv2.imwrite(str(i)+'.png', im)

cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

提前致谢.

python opencv image image-processing bounding-box

22
推荐指数
1
解决办法
3万
查看次数

使用Python和OpenCV查找红色

我试图从图像中提取红色.我有代码应用阈值只保留指定范围内的值:

img=cv2.imread('img.bmp')
img_hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_red = np.array([0,50,50]) #example value
upper_red = np.array([10,255,255]) #example value
mask = cv2.inRange(img_hsv, lower_red, upper_red)
img_result = cv2.bitwise_and(img, img, mask=mask)
Run Code Online (Sandbox Code Playgroud)

但是,正如我检查的那样,红色可以在范围内具有Hue值,比如从0到10,以及在170到180的范围内.因此,我想从这两个范围中的任何一个中保留值.我尝试将阈值从10设置为170并使用cv2.bitwise_not函数,但随后我也获得了所有白色.我认为最好的选择是为每个范围创建一个掩码并使用它们,所以我不得不在继续之前将它们连接在一起.

有没有办法使用OpenCV加入两个面具?或者还有其他方法可以实现我的目标吗?

编辑.我来的不是很优雅,但工作解决方案:

image_result = np.zeros((image_height,image_width,3),np.uint8)

for i in range(image_height):  #those are set elsewhere
    for j in range(image_width): #those are set elsewhere
        if img_hsv[i][j][1]>=50 \
            and img_hsv[i][j][2]>=50 \
            and (img_hsv[i][j][0] <= 10 or img_hsv[i][j][0]>=170):
            image_result[i][j]=img_hsv[i][j]
Run Code Online (Sandbox Code Playgroud)

它几乎满足了我的需求,而OpenCV的功能可能几乎完全相同,但如果有更好的方法(使用一些专用函数和编写更少的代码),请与我分享.:)

python opencv image image-processing hsv

20
推荐指数
2
解决办法
3万
查看次数

结合交叉边界矩形的有效方法

我正在尝试使用OpenCV简化以下图像:

在此输入图像描述

我们这里有很多红色的形状.其中一些完全包含其他人.他们中的一些人与邻居相交.我的目标是通过用联合多边形的边界框替换任何两个相交的形状来统一所有相交的形状.(重复直到没有更多相交的形状).

通过交叉我的意思是触摸.希望这使它100%清晰:

在此输入图像描述

我正在努力使用标准的形态学操作来有效地做到这一点; 显然它可以在O(N ^ 2)中天真地完成,但那太慢了.扩张没有帮助,因为一些形状只相差1px,如果它们没有相交,我不希望它们合并.

opencv image image-processing bounding-box computer-vision

19
推荐指数
3
解决办法
2万
查看次数

从具有不同布局的 PDF 文件中提取文本信息 - 机器学习

我目前正在尝试创建的 ML 项目需要帮助。

我从很多不同的供应商那里收到了很多发票——所有发票都有自己独特的布局。我需要从发票中提取3 个关键元素。这3 个元素都位于所有发票的表/行项目中。

3个要素是:

  • 1 : 关税编号(数字)
  • 2 : 数量(总是一个数字)
  • 3 : 总行数(货币价值)

请参考下面的屏幕截图,我在样本发票上标记了这些字段。

在此处输入图片说明

我使用基于正则表达式的模板方法开始了这个项目。然而,这根本无法扩展,我最终得到了大量不同的规则。

我希望机器学习可以帮助我 - 或者混合解决方案?

共同点

在我的所有发票中,尽管布局不同,但每个行项目将始终包含一个关税编号。此关税编号始终为 8 位数字,并且始终采用以下格式之一:

  • xxxxxxxxx
  • xxx.xxx
  • xx.xx.xx.xx

(其中“x”是 0 - 9 之间的数字)。

此外,正如您在发票上看到的,每行都有一个单价和一个总金额。我需要的金额始终是每行最高的。

输出

对于像上面那样的每张发票,我需要每一行的输出。例如,这可能是这样的:

{
    "line":"0",
    "tariff":"85444290",
    "quantity":"3",
    "amount":"258.93"
},
{
    "line":"1",
    "tariff":"85444290",
    "quantity":"4",
    "amount":"548.32"
},
{
    "line":"2",
    "tariff":"76109090",
    "quantity":"5",
    "amount":"412.30"
}
Run Code Online (Sandbox Code Playgroud)

然后去哪儿?

我不确定我要做什么属于机器学习,如果是,属于哪个类别。是计算机视觉吗?自然语言处理?命名实体识别?

我最初的想法是:

  1. 将发票转换为文本。(发票都是可文本化的 PDF,所以我可以使用类似的东西pdftotext来获取确切的文本值)
  2. 创建自定义命名实体 …

nlp machine-learning image-processing computer-vision neural-network

11
推荐指数
2
解决办法
2522
查看次数

在图像上找到主色

我想在图像上找到主色.为此,我知道我应该使用图像直方图.但我不确定图像格式.应该使用rgb,hsv或灰色图像中的哪一个?

计算直方图后,我应该在直方图上找到最大值.为此,我应该找到hsv图像的最大binVal值以下吗?为什么我的结果图像只包含黑色?

__CODE__

编辑:

我试过下面的代码.我画直方图.我的结果图片就在这里.二进制阈值后我没有找到任何东西.也许我发现最大直方图值不正确.

在此输入图像描述 在此输入图像描述

float binVal = hist.at<float>(h, s);
Run Code Online (Sandbox Code Playgroud)

opencv colors image-processing histogram image-segmentation

10
推荐指数
4
解决办法
2万
查看次数

无法在 Python OpenCV v4.20 中使用 SIFT

我正在使用 OpenCV v4.20 和 PyCharm IDE。我想使用SIFT算法。但我收到这个错误。我在互联网上寻找此错误的解决方案,但没有一个对我有帮助。你知道这个错误的解决方法吗?(使用 pip 我可以安装至少 3.4.2.16 版本的 OpenCV)

这是我的错误:

回溯(最近一次调用):文件“C:/Users/HP/PycharmProjects/features/featuredetect.py”,第 7 行,在 sift = cv.xfeatures2d_SIFT.create()

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1210: error: (-213: The function/feature is not implementation) 这个算法是已获得专利并被排除在此配置中;设置 OPENCV_ENABLE_NONFREE CMake 选项并在函数 'cv::xfeatures2d::SIFT::create' 中重建库

这是我的代码:

import cv2 as cv

image = cv.imread("the_book_thief.jpg")
gray_image = cv.cvtColor(image,cv.COLOR_BGR2GRAY)

sift = cv.xfeatures2d_SIFT.create()
keyPoints = sift.detect(image,None)

output = cv.drawKeypoints(image,keyPoints,None)

cv.imshow("FEATURES DETECTED",output)
cv.imshow("NORMAL",image)

cv.waitKey(0)
cv.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

python opencv image image-processing sift

7
推荐指数
3
解决办法
9128
查看次数

Find extreme outer points in image with Python OpenCV

I have this image of a statue.

在此处输入图片说明

I'm trying to find the top, bottom, left, and right most points on the statue. Is there a way to measure the edge of each side to determine the outer most point on the statue? I want to get the (x,y) coordinate of each side. I have tried to use cv2.findContours() and cv2.drawContours() to get an outline of the statue.

import cv2

img = cv2.imread('statue.png')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

contours = cv2.findContours(gray, cv2.RETR_TREE, …
Run Code Online (Sandbox Code Playgroud)

python opencv image image-processing computer-vision

6
推荐指数
3
解决办法
903
查看次数

使用 OpenCV 恢复图像以增强细节

我正在尝试恢复和增强几张照片的图像细节。我尝试通过使用简单的内核提高清晰度来cv2.filter2D()显示细节

我尝试过边缘检测内核

[-1 -1 -1]
[-1  9 -1]
[-1 -1 -1]
Run Code Online (Sandbox Code Playgroud)

和锐化内核

[ 0 -1  0]
[-1  5 -1]
[ 0 -1  0]
Run Code Online (Sandbox Code Playgroud)

但结果看起来有颗粒感且不自然。为了消除噪音,我尝试了诸如cv2.medianBlur()和 之类的模糊技术cv2.GaussianBlur(),但结果并不那么好。图像背景模糊或较暗,导致特征难以区分。有没有更好的方法来显示更多细节,尤其是在背景中?对 Python 或 C++ 开放

输入图像

在此输入图像描述

当前结果 在此输入图像描述

import numpy as np
import cv2

img = cv2.imread('people.jpg')
grayscale = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# edge_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpen_kernel = np.array([[0,-1,0], [-1,5,-1], [0,-1,0]])
img = cv2.filter2D(grayscale, -1, sharpen_kernel)

# Smooth out image
# blur = cv2.medianBlur(img, 3)
blur = cv2.GaussianBlur(img, …
Run Code Online (Sandbox Code Playgroud)

c++ python opencv image-processing computer-vision

4
推荐指数
1
解决办法
1万
查看次数

使用OpenCV确定一个点是否在ROI之内

我的目标是确定某个点是否位于ROI内。我设法裁剪了ROI,并可以像这样访问其宽度和高度

width = roi.shape[0] #total rows as width
height = roi.shape[1] #total columns as height
Run Code Online (Sandbox Code Playgroud)

但是,我缺少2个其他变量,即顶部和左侧坐标,以便构造以下语句来确定我的点是否存在于ROI中。

if(top < point_x < top + width and left < point_x < left + height)
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助和时间,谢谢。

python opencv roi image-processing computer-vision

4
推荐指数
1
解决办法
193
查看次数

增加图像中文本行之间的间距

我有一个单行距文本段落的输入图像。我正在尝试实现类似行间距选项的功能,以增加/减少 Microsoft Word 中文本行之间的间距。当前图像是单倍行距,如何将文本转换为双倍行距?或者说.5空间?本质上,我试图动态地重组文本行之间的间距,最好使用可调整的参数。像这样的东西:

输入图像

期望的结果

我目前的尝试看起来像这样。我已经能够稍微增加间距,但文本细节似乎被侵蚀,并且行之间存在随机噪音。

关于如何改进代码或任何更好的方法有什么想法吗?

import numpy as np 
import cv2

img = cv2.imread('text.png')
H, W = img.shape[:2]
grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshed = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]

hist = cv2.reduce(threshed, 1, cv2.REDUCE_AVG).reshape(-1)
spacing = 2
delimeter = [y for y in range(H - 1) if hist[y] <= spacing < hist[y + 1]]
arr = []
y_prev, y_curr = 0, 0
for y in delimeter:
    y_prev = y_curr
    y_curr = y
    arr.append(threshed[y_prev:y_curr, 0:W]) …
Run Code Online (Sandbox Code Playgroud)

python text opencv image-processing computer-vision

3
推荐指数
1
解决办法
1958
查看次数

改进 pytesseract 从图像中正确识别文本

我正在尝试使用pytesseract模块读取验证码。它大部分时间都提供准确的文本,但并非总是如此。

这是读取图像、操作图像和从图像中提取文本的代码。

import cv2
import numpy as np
import pytesseract

def read_captcha():
    # opencv loads the image in BGR, convert it to RGB
    img = cv2.cvtColor(cv2.imread('captcha.png'), cv2.COLOR_BGR2RGB)

    lower_white = np.array([200, 200, 200], dtype=np.uint8)
    upper_white = np.array([255, 255, 255], dtype=np.uint8)

    mask = cv2.inRange(img, lower_white, upper_white)  # could also use threshold
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)))  # "erase" the small white points in the resulting mask
    mask = cv2.bitwise_not(mask)  # invert mask

    # load background (could be an …
Run Code Online (Sandbox Code Playgroud)

python ocr opencv image-processing python-tesseract

2
推荐指数
1
解决办法
3020
查看次数