小编nat*_*ncy的帖子

如何使用OpenCV检测/查找复选框轮廓

我有几张图像需要通过使用计算机视觉检测复选框来进行OMR。

我正在使用findContours仅在扫描文档中的复选框上绘制轮廓。但是该算法提取文本的每个轮廓。

from imutils.perspective import four_point_transform
from imutils import contours
import numpy as np
import argparse, imutils, cv2, matplotlib
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

image = cv2.imread("1.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edged = cv2.Canny(blurred, 75, 200)

im_test = [blurred, cv2.GaussianBlur(gray, (7, 7), 0), cv2.GaussianBlur(gray, (5, 5), 5), cv2.GaussianBlur(gray, (11, 11), 0)]
im_thresh = [ cv2.threshold(i, 127, 255, 0)  for i in im_test ]
im_thresh_0 = [i[1] for i in im_thresh ] …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing computer-vision opencv-contour

7
推荐指数
1
解决办法
1011
查看次数

如何使用同一图片的二进制蒙版图像裁剪图像以去除python中的背景?

我尝试使用以下代码获取蒙版图像的边缘:

import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('ISIC_0000000_segmentation.png',0)
edges = cv2.Canny(img,0,255)

plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show
Run Code Online (Sandbox Code Playgroud)

我得到的是这样的:

在此处输入图片说明 但由于某种原因,边缘并不光滑。

我的计划是使用边缘图像裁剪以下图片:

有谁知道如何使边缘图像更好,以及如何使用它来裁剪正常图像?

编辑:@Mark Setchell 提出了一个很好的观点:如果我可以直接使用蒙版图像来裁剪图像,那就太好了。

另外:也许可以将正常图像精确地放置在蒙版图像上,以便蒙版上的黑色区域覆盖正常图片上的蓝色区域。

编辑:@Mark Setchell 引入了将 normale 图像与蒙版图像相乘的想法,因此背景将导致 0(黑色),其余部分将保持其颜色。当我的蒙版图像是 .png 并且我的正常图片是 .jpg 时,会不会有问题?

编辑:我编写了以下代码来尝试将两张图片相乘:

# Importing Image and ImageChops module from PIL package  
from PIL import Image, ImageChops 

# creating a image1 object 
im1 = Image.open("ISIC_0000000.jpg") 

# creating a image2 object 
im2 = …
Run Code Online (Sandbox Code Playgroud)

python opencv image image-processing computer-vision

7
推荐指数
1
解决办法
2518
查看次数

如何隔离轮廓内的所有内容,对其进行缩放并测试与图像的相似性?

我正在做一个只是为了好玩的项目,我的目标是玩在线扑克并让程序识别桌上的牌。我正在使用带有 python 的 OpenCV 来隔离卡片所在的区域。我已经能够拍摄该区域的图像,对其进行灰度和阈值处理,并在卡片边缘绘制轮廓。我现在被困在如何前进的问题上。

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

import cv2
from PIL import ImageGrab
import numpy as np

def processed(image):
    grayscaled = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresholded = cv2.Canny(grayscaled, threshold1 = 200, threshold2 = 200)

    return thresholded

def drawcard1():
    screen = ImageGrab.grab(bbox = (770,300,850,400))

    processed_img = processed(np.array(screen))  

    outside_contour, dummy = cv2.findContours(processed_img.copy(), 0,2)

    colored = cv2.cvtColor(processed_img, cv2.COLOR_GRAY2BGR)

    cv2.drawContours(colored, outside_contour, 0, (0,255,0),2)     

    cv2.imshow('resized_card', colored)

while True:
    drawcard1()



    if cv2.waitKey(25) & 0xFF == ord('w'):
        cv2.destroyAllWindows()
        break

Run Code Online (Sandbox Code Playgroud)

这是我到目前为止的结果:

单卡轮廓

我需要能够获取轮廓的内部,并删除它外部的任何东西。然后生成的图像应该只是卡片,我需要将其缩放到 49x68 像素。一旦我能做到这一点,我的计划是获得等级和西装的轮廓,并用白色像素填充它,然后我会将其与一组图像进行比较以确定最适合的。

我对 OpenCV 和图像处理非常陌生,但我发现这些东西非常吸引人!我已经能够通过谷歌走到这一步,但这次我找不到任何东西。

这是我现在用来替换游戏的图像:

游戏图片示例

这是我将用来比较桌卡的图像之一:

已知卡的图片

python opencv image image-processing computer-vision

7
推荐指数
1
解决办法
2047
查看次数

如何获得两幅图像之间的SSIM比较分数?

我正在尝试计算相应图像之间的 SSIM。例如,groundtruth 目录中名为 106.tif 的图像对应于 fake 目录中的“假”生成图像 106.jpg。

真实目录绝对路径是/home/pr/pm/zh_pix2pix/datasets/mousebrain/test/B 假目录绝对路径是/home/pr/pm/zh_pix2pix/output/fake_B

里面的图片是一一对应的,像这样: 见图片

我想一对一地比较数千张这样的图像。我不想将一张图像的 SSIM 与许多其他图像进行比较。相应的真实图像和假图像都具有相同的文件名,但扩展名不同(即106.tif和106.jpg),我只想将它们相互比较。

我正在努力以这种方式编辑用于 SSIM 比较的可用脚本。我想使用这个:https://github.com/mostafaGwely/Structural-Similarity-Index-SSIM-/blob/master/ssim.py但欢迎其他建议。代码也如下所示:

# Usage:
#
# python3 script.py --input original.png --output modified.png
# Based on: https://github.com/mostafaGwely/Structural-Similarity-Index-SSIM-

# 1. Import the necessary packages
#from skimage.measure import compare_ssim
from skimage.metrics import structural_similarity as ssim
import argparse
import imutils
import cv2

# 2. Construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-f", "--first", required=True, help="Directory of the image …
Run Code Online (Sandbox Code Playgroud)

python opencv image-processing ssim scikit-image

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

如何提高 OpenCV cv2.VideoCapture(0).read() 的性能

我在使用 intel core i7-4510u 的 Kali linux 上运行此脚本:

import cv2
from datetime import datetime
vid_cam = cv2.VideoCapture(0)
vid_cam.set(cv2.CAP_PROP_FPS, 25)
vid_cam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
vid_cam.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)

lastDate = datetime.now().second
fcount = 0
while(vid_cam.isOpened()):
    if(datetime.now().second>lastDate):
        lastDate = datetime.now().second
        print("Fps: " + str(fcount))
        fcount = 0
    else:
        fcount += 1
    ret, image_frame = vid_cam.read()
    cv2.imshow('frame', image_frame)
    if cv2.waitKey(100) & 0xFF == ord('q'):
        break
vid_cam.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

如果我运行它,它会打印Fps: 4
如果我检查任务管理器,我的 cpu 大约为 2%
问题可能出在哪里?

python video performance opencv video-streaming

6
推荐指数
1
解决办法
8110
查看次数

使用鼠标在 pyqtgraph 中仅在 x 或 y 方向缩放

我正在使用pyqtgraph,它使用鼠标滚轮具有开箱即用的缩放行为。然而,对于我的应用程序,我只需要放大 x 或 y 方向。

我希望做到以下几点:

  • 检测鼠标点击开始位置:x1,y1
  • 沿 x 或 y 方向拖动鼠标,然后释放鼠标。
  • 检测鼠标点击释放位置:x2,y2
  • 计算 dx = x2-x1 和 dy = y2-y1
  • 如果 dx > dy,则仅将绘图的 x 限制更新为 [x1, x2]。
  • 如果 dy > dx,则仅将绘图的 y 限制更新为 [y1, y2]。

在 pyqtgraph 中解决这个问题的最佳方法是什么?

python pyqtgraph

6
推荐指数
1
解决办法
3639
查看次数

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
查看次数

如何去除图像中的背景噪音而不损坏文本?

我正在为 tesseract 的 ocr 处理图像。我需要帮助来消除背景噪音而不损坏文本。

输入图像示例

这是一个示例图像

我尝试过中值模糊和删除小的连接组件(如何在不损坏文本的情况下删除点/噪音?)。连接组件的问题是噪声可能有更大的连接,如果不删除减号,我就无法摆脱它。有什么建议如何继续前进吗?

python opencv tesseract image image-processing

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

使用OpenCV Hough变换在2D点云中进行线检测

我已尽力找出如何使用OpenCV进行线路检测。但是,我找不到所需的示例。我想用它在简单的二维点云中找到线。作为测试,我想使用以下几点:

在此处输入图片说明

import random
import numpy as np
import matplotlib.pyplot as plt

a = np.random.randint(1,101,400)  # Random points.
b = np.random.randint(1,101,400)  # Random points.

for i in range(0, 90, 2):  # A line to detect
    a = np.append(a, [i+5])
    b = np.append(b, [0.5*i+30])

plt.plot(a, b, '.')
plt.show()
Run Code Online (Sandbox Code Playgroud)

我已经找到了有关霍夫变换如何工作的许多初始示例。但是,当涉及到代码示例时,我只能发现已使用图像。

有没有一种方法可以使用OpenCV Hough变换来检测一组点中的线,或者可以推荐其他方法或库吗?

----编辑----

阅读了一些很好的答案之后,我觉得我应该描述一下我打算使用它的目的。我有高分辨率的2D LiDAR,需要从数据中提取墙。打字扫描如下所示: 在此处输入图片说明

“正确的输出”如下所示: 在此处输入图片说明

在进行了更多研究之后,我怀疑霍夫变换在这种情况下使用效果不佳。关于我应该寻找的任何提示?

(如果有人感兴趣,可以使用LiDAR和墙面提取来生成地图并导航机器人。)

谢谢,雅各布

python opencv image-processing line computer-vision

6
推荐指数
1
解决办法
280
查看次数

读取彩色数字图像是什么数字以进行控制台

因此,我正在尝试创建一个程序,该程序可以查看图像的编号并在控制台中打印整数。(我正在使用 python 3)

例如,程序识别出以下图像(程序必须检查的实际图像)是数字 2:

2号

我试图将它与其中包含 2 的其他图像进行比较,cv2.matchTemplate()但是每次蓝色像素的 rgb 值对于每个图像都有一点不同,并且图像可能会更大或更小。例如下图:

2号

除了其他蓝色数字图像(0-9)之外,它还必须识别它,例如以下图像:

5号

我尝试了多个匹配模板代码,并制作了一个包含数字 0-9 图像的文件夹作为模板,但每次几乎每个数字都在需要识别的数字中被识别。例如数字 5 在数字 2 的图像中被识别。如果它不能识别所有这些,它就会识别错误的。

我试过的那些:

但就像我之前说的那样,这些问题也随之而来。

我还尝试查看每张图像中蓝色的百分比,但这些数字接近于通过查看其中的蓝色来告诉数字不同。

有没有人有办法解决吗?我是不是很笨,cv2.matchTemplate()有没有更简单的选择?(我不介意为此使用库,因为这是更大代码段的一部分,但我更喜欢对其进行编码,而不是库)

python opencv image image-processing python-3.x

6
推荐指数
1
解决办法
172
查看次数