【问题标题】:How realign segments of image in python?如何在python中重新对齐图像片段?
【发布时间】:2014-11-14 21:57:07
【问题描述】:

这是图像的样子:-

我想变成这样。:-

请看,在图片的第二张图片按钮上,图片已添加。我使用软件来执行此操作,他们将此选项称为 20 段。我不知道如何在 python 中执行此操作,有人可以帮我吗?我正在使用 python 2.7,我也是 python 新手,所以请用代码示例清楚地描述。我试过用 Opencv 向量间距来做,但总是给我错误的图像。

【问题讨论】:

  • 欢迎来到 Stack Overflow!告诉人们what you have tried 总是很重要的,包括任何失败的尝试,包括 sn-ps,以便他们了解您错过了哪些途径。这很重要,因为它会激发人们回答问题,而且它很重要,因为它可以更容易提供高质量、相关的答案。就问题的当前状态而言,这还没有实现。如果您编辑问题,则可能会阻止问题被关闭,并且您获得的答案的数量、质量和清晰度也会有所提高。
  • 这是用来处理验证码图片的吗?
  • 不,这不是@PM2Ring
  • 好的,正在检查。对不起,如果我侮辱了你。

标签: python python-2.7 opencv numpy python-imaging-library


【解决方案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.rectangle(im,(x,y),(x+w,y+h),(0,0,255),1)这一行

所以把它改成#cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),1)

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

【讨论】:

  • 谢谢。将近一年我没有和OpenCv一起工作!但由于使用轮廓对我来说很有趣,我仍然可以使用它!
  • 我第一个运行代码,但我没有将对象保存在对象文件夹中。请帮助我。谢谢@Kasra
  • 你创建对象文件夹吗?你必须先创建它!
  • 是的,我确实在该文件夹中找到了 shhh.jpg,但 cv2.imwrite('objects/pix%i.png'%i,im3) 我无法正常工作。我在该文件夹中没有找到其他对象。 @卡斯拉
  • 你看到物体周围的矩形了吗?在 shhh.jpg 中?
猜你喜欢
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 2014-04-05
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 2013-04-23
相关资源
最近更新 更多