如何在Python中的OpenCV2中获取彩色图像的接缝?

2024-10-01 02:30:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一段代码,以便从图像中删除接缝。目前,我的代码允许我从灰度图像中查找、突出显示和删除接缝。我需要删除彩色图像的接缝,我的代码不允许我这样做。有人能帮我修改代码,让我这样做吗

我的代码:

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)

我是否可以用我的代码来处理这个问题?如果这是我需要做的,我将修改函数


Tags: 代码inimportnoneimgnpcv2kernel