我正在编写一些代码,以使我能够消除图像中的接缝。目前,我的代码允许我查找,突出显示和删除灰度图像中的接缝。我需要删除彩色图像中的接缝,而我的代码将不允许我这样做。谁能帮助我修改代码以允许我执行此操作?
我的代码:

import numpy as np
import cv2
import math
import time

def getEdgeImage(img,margin=10):
    kernel=np.float64([[-1,0,1]])
    Ix=cv2.filter2D(img,cv2.CV_64F,kernel)
    Iy=cv2.filter2D(img,cv2.CV_64F,kernel)
    I=np.hypot(Ix,Iy)
    m=I.max()
    I[:,:margin]=m
    I[:,-margin:]=m
    return I

def getEnergyMap(img,repulseMask=None,attractMask=None):
    edges=getEdgeImage(img)
    if attractMask is not None:
        edges[attractMask==1]=-10
    if repulseMask is not None:
        edges[repulseMask==1]=235
    kernel=np.ones(3,np.float64)
    for i in range(1,len(edges)):
        minAbove=cv2.erode(edges[i-1],kernel).T[0]
        edges[i]+=minAbove
    return edges

def getSeam(img,repulseMask=None,attractMask=None):
    energyMap=getEnergyMap(img,repulseMask,attractMask)
    y=len(energyMap)-1
    x=np.argmin(energyMap[y])
    seam=[(x,y)]
    while len(seam)<len(energyMap):
        x,y=seam[-1]
        newY=y-1
        newX=x+np.argmin(energyMap[newY,x-1:x+2])-1
        seam.append((newX,newY))
    return seam

img1=cv2.imread("image.jpg") #[::2,::2]
# attractMask=img1*0
# repulseMask=img1*0
seam=getSeam(img1)
吸引和排斥遮罩对于当前的代码而言并不重要,它们只是被使用,因此我可以手动插入像素坐标以增加或减少在该坐标平面中进行的接缝数量。
运行此代码时出现错误:
Traceback (most recent call last):
  File "Program.py", line 110, in <module>
    seam=getSeam(img1)
  File "Program.py", line 62, in getSeam
    energyMap=getEnergyMap(img,repulseMask,attractMask)
  File "Program.py", line 58, in getEnergyMap
    edges[i]+=minAbove
ValueError: operands could not be broadcast together with shapes (960,3) (960,) (960,3)
无论如何,我可以使用它来处理我的代码吗?如果需要的话,我将修改功能。

最佳答案

然后尝试一下,这些是分别赋予功能的单独通道。

r=img1[:,:,0]
seam_r=getSeam(r)

g=img1[:,:,1]
seam_g=getSeam(g)

b=img1[:,:,2]
seam_b=getSeam(b)
之后,将结果分别传递到您的post函数。

关于python - 如何在Python的OpenCV2中获取彩色图像的接缝?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64566682/

10-12 21:42