java切割图片阴影区域(java虚拟机内存区域)

南宁夜生活 软件教程 2022-07-30 111 0

武汉大学提出ARGAN:注意力循环生成对抗模型用于检测、去除图像阴影 | ICCV 2019

下面是传统的最大滤波,最小滤波方法:

python速度比较慢,一张图需要几秒钟,输出的图,opencv不能show,效果有一点点

源码:

2.删除阴影时,有两件事要注意。由于图像是灰度图像,如果图像背景较浅且对象较暗,则必须先执行最大滤波,然后再执行最小滤波。如果图像背景较暗且物体较亮,我们可以先执行最小滤波,然后再进行最大滤波。

那么,最大过滤和最小过滤到底是什么?

3.最大滤波:让我们假设我们有一定大小的图像I。我们编写的算法应该逐个遍历I的像素,并且对于每个像素(x,y),它必须找到该像素周围的邻域(大小为N x N的窗口)中的最大灰度值,并进行写入A中相应像素位置(x,y)的最大灰度值。所得图像A称为输入图像I的最大滤波图像。现在让我们通过代码来实现这个概念。

max_filtering()函数接受输入图像和窗口大小N。

它最初在输入数组周围创建一个“墙”(带有-1的填充),当我们遍历边缘像素时会有所帮助。

然后,我们创建一个“ temp”变量,将计算出的最大值复制到其中。

然后,我们遍历该数组并围绕大小为N x N的当前像素创建一个窗口。

然后,我们使用“ amax()”函数在该窗口中计算最大值,并将该值写入temp数组。

我们将该临时数组复制到主数组A中,并将其作为输出返回。

A是输入I的最大滤波图像。

def max_filtering(N, I_temp):wall = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = I_temp.copy()temp = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)for y in range(0,wall.shape[0]):for x in range(0,wall.shape[1]):if wall[y,x]!=-1:window = wall[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num = np.amax(window)temp[y,x] = numA = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()return A

4.最小滤波:此算法与最大滤波完全相同,但是我们没有找到附近的最大灰度值,而是在该像素周围的N x N邻域中找到了最小值,并将该最小灰度值写入B中的(x,y)。所得图像B称为图像I的经过最小滤波的图像,代码如下。

def min_filtering(N, A):wall_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = A.copy()temp_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)for y in range(0,wall_min.shape[0]):for x in range(0,wall_min.shape[1]):if wall_min[y,x]!=300:window_min = wall_min[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]num_min = np.amin(window_min)temp_min[y,x] = num_minB = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()return B

5.因此,如果图像的背景较浅,我们要先执行最大过滤,这将为我们提供增强的背景,并将该最大过滤后的图像传递给最小过滤功能,该功能将负责实际的内容增强。

6.因此,执行最小-最大滤波后,我们获得的值不在0-255的范围内。因此,我们必须归一化使用背景减法获得的最终阵列,该方法是将原始图像减去最小-最大滤波图像,以获得去除阴影的最终图像。

#B is the filtered image and I is the original imagedef background_subtraction(I, B):O = I - Bnorm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)return norm_img

7.变量N(用于过滤的窗口大小)将根据图像中粒子或内容的大小进行更改。对于测试图像,选择大小N = 20。增强后的最终输出图像如下所示:

# -*- coding: UTF-8 -*-

import cv2

import numpy as np

import os

#%%

import cv2

import numpy as np

import matplotlib.pyplot as plt

#%%

def max_filtering(N, I_temp):

wall = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)

wall[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)] = I_temp.copy()

temp = np.full((I_temp.shape[0]+(N//2)*2, I_temp.shape[1]+(N//2)*2), -1)

for y in range(0,wall.shape[0]):

for x in range(0,wall.shape[1]):

if wall[y,x]!=-1:

window = wall[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]

num = np.amax(window)

temp[y,x] = num

A = temp[(N//2):wall.shape[0]-(N//2), (N//2):wall.shape[1]-(N//2)].copy()

return A

def min_filtering(N, A):

wall_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)

wall_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)] = A.copy()

temp_min = np.full((A.shape[0]+(N//2)*2, A.shape[1]+(N//2)*2), 300)

for y in range(0,wall_min.shape[0]):

for x in range(0,wall_min.shape[1]):

if wall_min[y,x]!=300:

window_min = wall_min[y-(N//2):y+(N//2)+1,x-(N//2):x+(N//2)+1]

num_min = np.amin(window_min)

temp_min[y,x] = num_min

B = temp_min[(N//2):wall_min.shape[0]-(N//2), (N//2):wall_min.shape[1]-(N//2)].copy()

return B

def background_subtraction(I, B):

O = I - B

norm_img = cv2.normalize(O, None, 0,255, norm_type=cv2.NORM_MINMAX)

return norm_img

def min_max_filtering(M, N, I):

if M == 0:

#max_filtering

A = max_filtering(N, I)

#min_filtering

B = min_filtering(N, A)

#subtraction

normalised_img = background_subtraction(I, B)

elif M == 1:

#min_filtering

A = min_filtering(N, I)

#max_filtering

B = max_filtering(N, A)

#subtraction

normalised_img = background_subtraction(I, B)

return normalised_img

P = cv2.imread('Test_image.jpg',0)

cv2.imshow("asdf",P)

O_P = min_max_filtering(M = 0, N = 20, I = P)

cv2.imshow("O_P",O_P)

cv2.waitKey()

评论

复制成功

QQ: 1950939939
南宁KB舒缓会馆

我知道了
南宁kb舒缓会馆
QQ:1950939939加QQ
1950939939