Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中重新对齐图像段?_Python_Python 2.7_Opencv_Numpy_Python Imaging Library - Fatal编程技术网

如何在python中重新对齐图像段?

如何在python中重新对齐图像段?,python,python-2.7,opencv,numpy,python-imaging-library,Python,Python 2.7,Opencv,Numpy,Python Imaging Library,这是一幅如下所示的图像:- 我想变成这样。:- 请看,在第二张图片中,图片的按钮被拉起。我用一个软件来做这件事,他们把这个选项称为段到20。我不知道用python怎么做,有人能帮我吗?我使用的是Python2.7,我也是python新手,所以请用代码示例清楚地描述。我曾尝试使用Opencv矢量间距来实现这一点,但一直都给我错误的图像 首先,您需要找到图像中的对象(数字),并将其保存在/objects文件夹中。您可以使用cv2.findContours()找到轮廓,然后使用cv2.boundi

这是一幅如下所示的图像:-

我想变成这样。:-


请看,在第二张图片中,图片的按钮被拉起。我用一个软件来做这件事,他们把这个选项称为段到20。我不知道用python怎么做,有人能帮我吗?我使用的是Python2.7,我也是python新手,所以请用代码示例清楚地描述。我曾尝试使用Opencv矢量间距来实现这一点,但一直都给我错误的图像

首先,您需要找到图像中的对象(数字),并将其保存在
/objects
文件夹中。您可以使用
cv2.findContours()
找到轮廓,然后使用
cv2.boundingRect()
方法找到边界矩形的坐标

import numpy as np
import cv2

im = cv2.imread('old_image.png') 
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)

contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
i=0    
for cnt in contours:
     [x,y,w,h] = cv2.boundingRect(cnt)
     if h>60:
      cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),1)
      im3=im[y:y+h,x:x+w]
      cv2.imwrite('objects/pix%i.png'%i,im3)
      i+=1
cv2.imshow('norm',im)
cv2.imwrite('objects/shhh.jpg',im)
key = cv2.waitKey(0)
结果:

最后,您只需将保存的对象与新对齐连接起来:

import numpy as np
import cv2

im0 = cv2.imread('objects/pix0.png',0)
im1 = cv2.imread('objects/pix1.png',0)
im2 = cv2.imread('objects/pix2.png',0)
im3 = cv2.imread('objects/pix3.png',0)
im4 = cv2.imread('objects/pix4.png',0)
im5 = cv2.imread('objects/pix5.png',0)

h0, w0 = im0.shape[:2]
h1, w1 = im1.shape[:2]
h2, w2 = im2.shape[:2]
h3, w3 = im3.shape[:2]
h4, w4 = im4.shape[:2]
h5, w5 = im5.shape[:2]
maxh=max(h0,h1,h2,h3,h4,h5)

#add 50 for space between the objects

new = np.zeros((maxh, w0+w1+w2+w3+w4+w5+50),np.uint8)
new=(255-new)
new[maxh-h0:, :w0] = im0
new[maxh-h1:, w0+10:w0+w1+10] = im1
new[maxh-h2:, w0+w1+20:w0+w1+w2+20] = im2
new[maxh-h3:, w0+w1+w2+30:w0+w1+w2+w3+30] = im3
new[maxh-h4:, w0+w1+w2+w3+40:w0+w1+w2+w3+w4+40] = im4
new[maxh-h5:, w0+w1+w2+w3+w4+50:] = im5
gray = cv2.cvtColor(new, cv2.COLOR_GRAY2BGR)


cv2.imshow('norm',gray)
cv2.imwrite('objects/new_image.jpg',gray)
key = cv2.waitKey(0)
结果:

对于删除黑线,您可以注释行
cv2.矩形(im,(x,y),(x+w,y+h),(0,0255),1)

因此,将其更改为
#cv2.矩形(im,(x,y),(x+w,y+h),(0,0255),1)

注释矩形绘图命令后的结果!:

首先,您需要找到图像中的对象(数字),并将其保存在
/objects
文件夹中。您可以使用
cv2.findContours()
找到轮廓,然后使用
cv2.boundingRect()
方法找到边界矩形的坐标

import numpy as np
import cv2

im = cv2.imread('old_image.png') 
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray,(5,5),0)
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2)

contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
i=0    
for cnt in contours:
     [x,y,w,h] = cv2.boundingRect(cnt)
     if h>60:
      cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),1)
      im3=im[y:y+h,x:x+w]
      cv2.imwrite('objects/pix%i.png'%i,im3)
      i+=1
cv2.imshow('norm',im)
cv2.imwrite('objects/shhh.jpg',im)
key = cv2.waitKey(0)
结果:

最后,您只需将保存的对象与新对齐连接起来:

import numpy as np
import cv2

im0 = cv2.imread('objects/pix0.png',0)
im1 = cv2.imread('objects/pix1.png',0)
im2 = cv2.imread('objects/pix2.png',0)
im3 = cv2.imread('objects/pix3.png',0)
im4 = cv2.imread('objects/pix4.png',0)
im5 = cv2.imread('objects/pix5.png',0)

h0, w0 = im0.shape[:2]
h1, w1 = im1.shape[:2]
h2, w2 = im2.shape[:2]
h3, w3 = im3.shape[:2]
h4, w4 = im4.shape[:2]
h5, w5 = im5.shape[:2]
maxh=max(h0,h1,h2,h3,h4,h5)

#add 50 for space between the objects

new = np.zeros((maxh, w0+w1+w2+w3+w4+w5+50),np.uint8)
new=(255-new)
new[maxh-h0:, :w0] = im0
new[maxh-h1:, w0+10:w0+w1+10] = im1
new[maxh-h2:, w0+w1+20:w0+w1+w2+20] = im2
new[maxh-h3:, w0+w1+w2+30:w0+w1+w2+w3+30] = im3
new[maxh-h4:, w0+w1+w2+w3+40:w0+w1+w2+w3+w4+40] = im4
new[maxh-h5:, w0+w1+w2+w3+w4+50:] = im5
gray = cv2.cvtColor(new, cv2.COLOR_GRAY2BGR)


cv2.imshow('norm',gray)
cv2.imwrite('objects/new_image.jpg',gray)
key = cv2.waitKey(0)
结果:

对于删除黑线,您可以注释行
cv2.矩形(im,(x,y),(x+w,y+h),(0,0255),1)

因此,将其更改为
#cv2.矩形(im,(x,y),(x+w,y+h),(0,0255),1)

注释矩形绘图命令后的结果!:

欢迎使用堆栈溢出!告诉别人总是很重要的,包括任何失败尝试的片段,这样他们就能理解你错过了什么。这一点很重要,因为它激励人们回答问题,这一点很重要,因为它使人们更容易给出高质量、相关的答案。就目前的状况而言,这一目标尚未实现。如果您编辑问题,可能会阻止问题关闭,并且您得到的答案的数量、质量和清晰度也会提高。这是用于处理验证码图像吗?不,这不是@PM2RingOk,只是检查。对不起,我侮辱了你。欢迎来到Stack Overflow!告诉别人总是很重要的,包括任何失败尝试的片段,这样他们就能理解你错过了什么。这一点很重要,因为它激励人们回答问题,这一点很重要,因为它使人们更容易给出高质量、相关的答案。就目前的状况而言,这一目标尚未实现。如果您编辑问题,可能会阻止问题关闭,并且您得到的答案的数量、质量和清晰度也会提高。这是用于处理验证码图像吗?不,这不是@PM2RingOk,只是检查。对不起,我侮辱了你。谢谢。将近一年了,我没有使用
OpenCv
!但由于轮廓线对我来说很有趣,我仍然可以使用它!我正在运行第一个代码,但它没有将对象保存在对象文件夹中。。请帮帮我。谢谢@Kasrado您创建了对象文件夹吗?你必须先创建它!是的,我在那个文件夹中找到了shhh.jpg,但是cv2.imwrite('objects/pix%I.png'%I,im3')不工作。我在那个文件夹上找不到其他对象@你看到物体周围的矩形了吗?在shhh.jpg?谢谢。将近一年了,我没有使用
OpenCv
!但由于轮廓线对我来说很有趣,我仍然可以使用它!我正在运行第一个代码,但它没有将对象保存在对象文件夹中。。请帮帮我。谢谢@Kasrado您创建了对象文件夹吗?你必须先创建它!是的,我在那个文件夹中找到了shhh.jpg,但是cv2.imwrite('objects/pix%I.png'%I,im3')不工作。我在那个文件夹上找不到其他对象@你看到物体周围的矩形了吗?在shhh.jpg中?