编辑出 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
如果有人有更好、更高效或更优雅的解决方案,我仍然愿意接受教育。
我有一张 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
如果有人有更好、更高效或更优雅的解决方案,我仍然愿意接受教育。