我正在编写一些代码以允许我从图像中删除接缝。目前,我的代码允许我从灰度图像中查找、突出显示和删除接缝。我需要从彩色图像中移除接缝,而我的代码不允许我这样做。谁能帮我修改我的代码以允许我这样做?
我的代码:
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)
无论如何,我可以让它与我的代码一起使用吗?如果这是我需要做的,我会修改这些功能。
最佳答案
然后试试这个,这些是单独分配给功能的单独 channel 。
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/