我有几百张图像(扫描的文档),其中大多数是歪斜的。我想使用Python使它们偏斜。
这是我使用的代码:
import numpy as np
import cv2
from skimage.transform import radon
filename = 'path_to_filename'
# Load file, converting to grayscale
img = cv2.imread(filename)
I = cv2.cvtColor(img, COLOR_BGR2GRAY)
h, w = I.shape
# If the resolution is high, resize the image to reduce processing time.
if (w > 640):
I = cv2.resize(I, (640, int((h / w) * 640)))
I = I - np.mean(I) # Demean; make the brightness extend above and below zero
# Do the radon transform
sinogram = …
Run Code Online (Sandbox Code Playgroud) 我有一个包含身份证、账单和护照的图像数据库。
我想将这些图像分为不同的组(即身份证、账单和护照)。
正如我所读到的那样,完成这项任务的方法之一是聚类(因为它将是无人监督的)。
我的想法是这样的:聚类将基于图像之间的相似性(即具有相似特征的图像将被分组在一起)。
我也知道这个过程可以通过使用 k-means 来完成。
所以我的问题是关于特征和使用 K-means 的图像。
如果有人以前做过这件事,或者对此有所了解,请您推荐一些链接以开始或建议任何有用的功能。
python cluster-analysis computer-vision k-means unsupervised-learning
我从互联网上下载了一张随机图像,使用它打开它PIL.Image.open()
,cv2.imread()
然后检查了一些像素的值。问题是我使用 PIL 和 Opencv 得到了相同像素的不同值!
这是我尝试过的图像:
这就是我所做的:
>>> import cv2
>>> from PIL import Image
>>> img = cv2.imread('img.jpg')
>>> im = Image.open('img.jpg')
>>> img[0][0]
>>> array([142, 152, 146], dtype=uint8)
>>> im.getpixel((0, 0))
>>> (138, 158, 131)
Run Code Online (Sandbox Code Playgroud)
两者的 R、G、B 值((138!= 146)、(158!= 152)、(131!= 142))im
不匹配,尽管它们img
是相同的像素和相同的图像!
我查看了SO帖子,发现这篇文章讨论了同样的问题,所以我使用发布的代码再次检查差异:
from PIL import Image
import cv2
import sys
from hashlib import md5
import numpy as np
def hashIm(im):
imP = np.array(Image.open(im))
# Convert to BGR …
Run Code Online (Sandbox Code Playgroud) 我有一个包含不同类型文件的文件夹。我只需要处理图像文件(jpg、png、jpeg、JPG...)。为此,我glob.glob
只获取带有“jpg”、“png”等扩展名的文件。
问题是我必须使用glob.glob
多次(与图像扩展名数量一样多)才能获取所有图像:
import glob
images = glob.glob('tests/*.jpg') + glob.glob('tests/*.jpeg') + glob.glob('tests/*.png') + glob.glob('tests/*.JPG')
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以glob.glob
以更优化的形式使用(类似glob.glob('path/*.{'jpg', 'png', 'jpeg', 'JPG'}
),或者是否有更简单的函数来使用它而不是glob
?
我有一个包含文本但有非直线绘制的图像。
我想删除这些行而不影响/删除文本中的任何内容。
为此,我使用了霍夫概率变换:
import cv2
import numpy as np
def remove_lines(filename):
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 200)
lines = cv2.HoughLinesP(edges, rho=1, theta=1*np.pi/180,
threshold=100, minLineLength=100, maxLineGap=5)
# Draw lines on the image
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 3)
cv2.imwrite('result', img)
Run Code Online (Sandbox Code Playgroud)
结果不如我预期的好:
没有完全检测到线条(仅检测到线条的某些线段,直线段)。
我对cv2.Canny
和cv2.HoughLinesP
参数做了一些调整,但是也没有用。
我也尝试过cv2.createLineSegmentDetector
(由于许可证问题,在最新版本的opencv中不可用,因此我不得不将opencv降级到4.0.0.21版):
import cv2
import numpy as np
def remove_lines(filename):
im = cv2.imread(filename)
gray …
Run Code Online (Sandbox Code Playgroud) 我有一个列表,其元素由字母和数字组成,如下所示:
['H1', 'H100', 'H10', 'H3', 'H2', 'H6', 'H11', 'H50', 'H5', 'H99', 'H8']
Run Code Online (Sandbox Code Playgroud)
我想对其进行排序,所以我使用了函数 sort,但我得到了输出:
>>> a = ['H1', 'H100', 'H10', 'H3', 'H2', 'H6', 'H11', 'H50', 'H5', 'H99', 'H8']
>>> print sorted(a)
['H1', 'H10', 'H100', 'H11', 'H2', 'H3', 'H5', 'H50', 'H6', 'H8', 'H99']
Run Code Online (Sandbox Code Playgroud)
但是,我希望输出是:
['H1', 'H2', 'H3', 'H5', 'H6', 'H8', 'H10', 'H11', 'H50', 'H99', 'H100']
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点吗?谢谢
我正在开发一个使用 sqlalchemy、postgres 和 alembic 的应用程序。
\n项目结构如下:
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alembic.ini\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 migrations\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 env.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 script.py.mako\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 versions\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 models\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 datamodel1.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 datamodel2.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 requirements.txt\n\n3 directories, 10 files\n
Run Code Online (Sandbox Code Playgroud)\n其中:
\n的内容models/base.py
是:
from sqlalchemy.ext.declarative.api import declarative_base, DeclarativeMeta\n\nBase: DeclarativeMeta = declarative_base()\n
Run Code Online (Sandbox Code Playgroud)\n的内容models/datamodel1.py
是:
from models.base import Base\nfrom sqlalchemy.sql.schema import Column\nfrom sqlalchemy.sql.sqltypes import String, Date, Float\n\n\nclass Model1(Base):\n __tablename__ = 'model1_table'\n\n model1_id = Column(String, primary_key=True)\n col1 = Column(String)\n col2 = Column(String)\n
Run Code Online (Sandbox Code Playgroud)\n的内容models/datamodel2.py …
我使用3个数据类别(身份证,护照,账单)训练了CNN分类器(使用tensorflow)。
当我用属于3类之一的图像进行测试时,它给出了正确的预测。但是,当我用错误的图像(例如汽车图像)对其进行测试时,它会一直给我预测(即,它预测该汽车属于ID卡类别)。
有没有办法使它显示错误消息而不是给出错误的预测?
我正在处理扫描文件(身份证、驾照……)。当我对它们进行一些预处理时,我遇到的问题是文档仅占据图像的一小部分,所有其余区域都是空白/噪声空间。出于这个原因,我想开发一个 Python 代码,自动修剪不需要的区域并仅保留文档所在的区域(无需我预先定义每个文档的分辨率)。findContours()
使用OpenCV就可以实现这一点。然而,大多数文档(尤其是旧文档)轮廓不清晰,四肢不够清晰,无法被检测到。另外,空白区域中的噪声也可以被检测为轮廓。因此轮廓并不适用于所有情况。
我的想法是:
bitwise_not()
OpenCV 的函数将背景与前景分开。在这个级别,我的背景几乎是白色的,文档是黑色的,但包含一些白色间隙。
这是我的代码和一些评论:
import cv2
import numpy as np
def crop(filename):
#Read the image
img = cv2.imread(filename)
#Convert to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#Separate the background from the foreground
bit = cv2.bitwise_not(gray)
#Apply adaptive mean thresholding
amtImage = cv2.adaptiveThreshold(bit, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 35, 15)
#Apply erosion to fill the gaps
kernel = np.ones((15,15),np.uint8)
erosion = cv2.erode(amtImage,kernel,iterations = 2)
#Take the height …
Run Code Online (Sandbox Code Playgroud) 有没有办法在python中检查pytesseract版本?
根据pytesseract的PyPi文档,有一个内置函数get_tesseract_version
来获取pytesseract版本。但是当我在 python 中运行它时,我得到以下信息:
>>> import pytesseract
>>> pytesseract.get_tesseract_version
<function get_tesseract_version at 0x7f4b9edd4598>
>>> print(pytesseract.get_tesseract_version)
<function get_tesseract_version at 0x7f4b9edd4598>
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 pytesseract 版本pip freeze
,但我想使用 python 获得它。那可能吗?
python ×9
opencv ×4
alembic ×1
glob ×1
image ×1
k-means ×1
line ×1
list ×1
optimization ×1
postgresql ×1
python-3.x ×1
skew ×1
sorting ×1
sqlalchemy ×1
tensorflow ×1