编辑出 python 中的部分图像

Editing out part of an image in python

我有一张 collection 的图片,其中包含公海 horizon 上或附近的船只。我正在尝试创建一个图像,从图像中移除船只,同时保持大部分背景完好无损。我最初的尝试是黑白扫描模糊图像的每一行和每一列,如果值超过某个阈值,则将其中的值替换为该行的中值:

colorImage= cv2.imread(path,1)  # where path is the directory to my image
gray = cv2.cvtColor(colorImage, cv2.COLOR_BGR2GRAY)
gray= cv2.GaussianBlur(gray, (21,21), 0)
bkgd= gray
imageHeight, imageWidth= bkgd.shape

for row in range(0, imageHeight):
    for column in range(0, imageWidth):
        if bkgd[row, column] > 100:
            bkgd[row, column]= int(np.median(bkgd[row]))

100 是我选择的一个任意值,它非常类似于天空在模糊 b/w 图像中的最小值,从而使来自海洋的所有噪声完好无损(用于比较原始图像和运送到没有的那个)。当天空中有来自云层的噪音时,这个过程会变慢并产生不稳定的结果。 cv2 或其他一些库中是否有更好的方法来完成我要生成的内容?

好吧,我在任何人回复之前就想出了一个解决方案,所以这就是我想出的办法。通过用中位数替换每个像素,我走在了正确的轨道上,但我反而利用了一些 numpy 数组魔法,只迭代了行而不是行和列。我还将该方法应用于 BGR 中的彩色图像而不是黑白图像:

def remove_ship(colorImage):

    imageHeight, imageWidth, channel= colorImage.shape
    bkgd= colorImage
    highFactor= 1.05
    lowFactor= .95
    for row in range(0, imageHeight):
        bRow= np.array(bkgd[row, :, 0])
        gRow= np.array(bkgd[row, :, 1])
        rRow= np.array(bkgd[row, :, 2])
        noBlack= np.where(bRow != 0) # exclude the 0's in the array to find the true median.
        black= np.where(bRow == 0)   # collect the indices of the blacks to recolor them black later
        bMedian= np.median(bRow[noBlack])
        bReplace= np.where(bRow > int(highFactor * bMedian))
        bReplace= np.append(bReplace, [np.where(bRow < int(lowFactor * bMedian))])
        bRow[bReplace]= bMedian
        bRow[black]= 0 
        bkgd[row, :, 0]= bRow

        gMedian= np.median(gRow[noBlack])
        gReplace= np.where(gRow > int(highFactor * gMedian))
        gReplace= np.append(gReplace, [np.where(gRow < int(lowFactor * gMedian))])
        gRow[gReplace]= gMedian
        gRow[black]= 0
        bkgd[row, :, 1]= gRow

        rMedian= np.median(rRow[noBlack])
        rReplace= np.where(rRow > int(highFactor * rMedian))
        rReplace= np.append(rReplace, [np.where(rRow < int(lowFactor * rMedian))])
        rRow[rReplace]= rMedian
        rRow[black]= 0
        bkgd[row, :, 2]= rRow

如果有人有更好、更高效或更优雅的解决方案,我仍然愿意接受教育。