在python中编辑部分图像

2024-04-18 01:41:34 发布

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

我收集了一组图片,展示了远洋地平线上或附近的船只。我试图创建一个图像,删除船舶(s)的形象,而留下了大部分的背景完好无损。我最初的尝试是用黑白扫描模糊图像的每一行和每一列,如果值超过某个阈值,则用行的中值替换其中的值:

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是我选择的一个任意值,它与模糊黑白图像中天空的最小值非常相似,因此保留了来自海洋的所有噪声(用于将原始图像与船进行比较)。当天空中有云层发出的噪音时,这个过程会变慢并产生不稳定的结果。在cv2或其他库中有没有更好的方法来完成我的工作?你知道吗


Tags: pathin图像for图片rangecolumncv2
1条回答
网友
1楼 · 发布于 2024-04-18 01:41:34

好吧,在别人回答之前我就想出了一个解决办法,下面是我的想法。我用中间值替换每个像素是正确的,但是我使用了一些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

如果有人有更好的,更有效的,或优雅的解决方案,我仍然希望接受教育。你知道吗

相关问题 更多 >