我有几张图像需要通过使用计算机视觉检测复选框来进行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
我尝试使用以下代码获取蒙版图像的边缘:
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 来隔离卡片所在的区域。我已经能够拍摄该区域的图像,对其进行灰度和阈值处理,并在卡片边缘绘制轮廓。我现在被困在如何前进的问题上。
到目前为止,这是我的代码:
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 和图像处理非常陌生,但我发现这些东西非常吸引人!我已经能够通过谷歌走到这一步,但这次我找不到任何东西。
这是我现在用来替换游戏的图像:
这是我将用来比较桌卡的图像之一:
我正在尝试计算相应图像之间的 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) 我在使用 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%。
问题可能出在哪里?
我正在使用pyqtgraph,它使用鼠标滚轮具有开箱即用的缩放行为。然而,对于我的应用程序,我只需要放大 x 或 y 方向。
我希望做到以下几点:
在 pyqtgraph 中解决这个问题的最佳方法是什么?
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) 我正在为 tesseract 的 ocr 处理图像。我需要帮助来消除背景噪音而不损坏文本。
输入图像示例
我尝试过中值模糊和删除小的连接组件(如何在不损坏文本的情况下删除点/噪音?)。连接组件的问题是噪声可能有更大的连接,如果不删除减号,我就无法摆脱它。有什么建议如何继续前进吗?
我已尽力找出如何使用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 3)
例如,程序识别出以下图像(程序必须检查的实际图像)是数字 2:
我试图将它与其中包含 2 的其他图像进行比较,cv2.matchTemplate()
但是每次蓝色像素的 rgb 值对于每个图像都有一点不同,并且图像可能会更大或更小。例如下图:
除了其他蓝色数字图像(0-9)之外,它还必须识别它,例如以下图像:
我尝试了多个匹配模板代码,并制作了一个包含数字 0-9 图像的文件夹作为模板,但每次几乎每个数字都在需要识别的数字中被识别。例如数字 5 在数字 2 的图像中被识别。如果它不能识别所有这些,它就会识别错误的。
我试过的那些:
但就像我之前说的那样,这些问题也随之而来。
我还尝试查看每张图像中蓝色的百分比,但这些数字接近于通过查看其中的蓝色来告诉数字不同。
有没有人有办法解决吗?我是不是很笨,cv2.matchTemplate()
有没有更简单的选择?(我不介意为此使用库,因为这是更大代码段的一部分,但我更喜欢对其进行编码,而不是库)
python ×10
opencv ×9
image ×5
line ×1
performance ×1
pyqtgraph ×1
python-3.x ×1
scikit-image ×1
ssim ×1
tesseract ×1
video ×1