Added docstring
This commit is contained in:
parent
374195cc41
commit
2d3f4f05be
53
NumpyHDR.py
53
NumpyHDR.py
@ -3,13 +3,31 @@ import numpy as np
|
|||||||
#import matplotlib.pyplot as plt
|
#import matplotlib.pyplot as plt
|
||||||
|
|
||||||
class NumpyHDR:
|
class NumpyHDR:
|
||||||
'''Numpy and PIL implementation of a Mertens Fusion alghoritm'''
|
'''Numpy and PIL implementation of a Mertens Fusion alghoritm
|
||||||
def __init__(self):
|
Usage: Instantiate then set attributes:
|
||||||
self.input_image: list
|
input_image = List containing path strings including .jpg Extension
|
||||||
self.output_path: str = '/'
|
output_path = String ot Output without jpg ending
|
||||||
self.compress_quality: int = 50
|
compress_quality = 0-100 Jpeg compression level defaults to 75
|
||||||
|
|
||||||
def plot_histogram(image, title="Histogram", bins=256):
|
Run function sequence() to start processing.
|
||||||
|
Example:
|
||||||
|
|
||||||
|
hdr = numpyHDR.NumpyHDR()
|
||||||
|
|
||||||
|
hdr.input_image = photos/EV- stages/
|
||||||
|
hdr.compress_quality = 50
|
||||||
|
hdr.output_path = photos/result/
|
||||||
|
hdr.sequence()
|
||||||
|
|
||||||
|
returns: Nothing
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
self.input_image: list = []
|
||||||
|
self.output_path: str = '/'
|
||||||
|
self.compress_quality: int = 75
|
||||||
|
|
||||||
|
def plot_histogram(self, image, title="Histogram", bins=256):
|
||||||
"""Plot the histogram of an image.
|
"""Plot the histogram of an image.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -25,7 +43,7 @@ class NumpyHDR:
|
|||||||
plt.show()
|
plt.show()
|
||||||
### Experimental functions above this line. chatGPT sketches
|
### Experimental functions above this line. chatGPT sketches
|
||||||
|
|
||||||
def simple_clip(fused,gamma):
|
def simple_clip(self, fused,gamma):
|
||||||
# Apply gamma correction
|
# Apply gamma correction
|
||||||
fused = np.clip(fused, 0, 1)
|
fused = np.clip(fused, 0, 1)
|
||||||
fused = np.power(fused, 1.0 / gamma)
|
fused = np.power(fused, 1.0 / gamma)
|
||||||
@ -33,7 +51,9 @@ class NumpyHDR:
|
|||||||
fused = (255.0 * fused).astype(np.uint8)
|
fused = (255.0 * fused).astype(np.uint8)
|
||||||
#fused = Image.fromarray(fused)
|
#fused = Image.fromarray(fused)
|
||||||
|
|
||||||
def convolve2d(image, kernel):
|
return fused
|
||||||
|
|
||||||
|
def convolve2d(self, image, kernel):
|
||||||
"""Perform a 2D convolution on the given image with the given kernel.
|
"""Perform a 2D convolution on the given image with the given kernel.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -73,14 +93,16 @@ class NumpyHDR:
|
|||||||
|
|
||||||
return convolved_image
|
return convolved_image
|
||||||
|
|
||||||
def mask(img, center=50, width=20, threshold=0.2):
|
def mask(self, img, center=50, width=20, threshold=0.2):
|
||||||
|
'''Mask with sigmoid smooth'''
|
||||||
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
||||||
mask = np.where(img > threshold, mask, 1) # Apply threshold to the mask
|
mask = np.where(img > threshold, mask, 1) # Apply threshold to the mask
|
||||||
mask = img * mask
|
mask = img * mask
|
||||||
#plot_histogram(mask, title="mask")
|
#plot_histogram(mask, title="mask")
|
||||||
return mask
|
return mask
|
||||||
|
|
||||||
def shadowlift(img, center=200, width=20, threshold=0.2, amount=1):
|
def shadowlift(self, img, center=200, width=20, threshold=0.2, amount=1):
|
||||||
|
'''Mask with sigmoid smooth targets dark sections'''
|
||||||
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
||||||
print(mask)
|
print(mask)
|
||||||
print(img)
|
print(img)
|
||||||
@ -91,14 +113,15 @@ class NumpyHDR:
|
|||||||
|
|
||||||
return img_adjusted
|
return img_adjusted
|
||||||
|
|
||||||
def highlightdrop(img, center=200, width=20, threshold=0.8, amount: float=1):
|
def highlightdrop(self, img, center=200, width=20, threshold=0.8, amount: float=1):
|
||||||
|
'''Mask with sigmoid smooth targets bright sections'''
|
||||||
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
mask = 1 / (1 + np.exp((center - img) / width)) # Smooth gradient mask
|
||||||
mask = np.where(img > threshold, mask, 1) # Apply threshold to the mask
|
mask = np.where(img > threshold, mask, 1) # Apply threshold to the mask
|
||||||
img_adjusted = img + mask * (-amount) # Adjust the image with a user-specified amount
|
img_adjusted = img + mask * (-amount) # Adjust the image with a user-specified amount
|
||||||
|
|
||||||
return img_adjusted
|
return img_adjusted
|
||||||
|
|
||||||
def mertens_fusion(image_paths, gamma=2.2, contrast_weight=0.2):
|
def mertens_fusion(self, image_paths, gamma=2.2, contrast_weight=0.2):
|
||||||
"""Fuse multiple exposures into a single HDR image using the Mertens algorithm.
|
"""Fuse multiple exposures into a single HDR image using the Mertens algorithm.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -112,6 +135,7 @@ class NumpyHDR:
|
|||||||
# Load the input images and convert them to floating-point format.
|
# Load the input images and convert them to floating-point format.
|
||||||
images = []
|
images = []
|
||||||
for path in image_paths:
|
for path in image_paths:
|
||||||
|
#print(path)
|
||||||
img = Image.open(path).convert('RGB')
|
img = Image.open(path).convert('RGB')
|
||||||
img = img.resize((1920, 1080))
|
img = img.resize((1920, 1080))
|
||||||
img = np.array(img).astype(np.float32) / 255.0
|
img = np.array(img).astype(np.float32) / 255.0
|
||||||
@ -124,7 +148,7 @@ class NumpyHDR:
|
|||||||
gray = np.dot(img, [0.2989, 0.5870, 0.1140])
|
gray = np.dot(img, [0.2989, 0.5870, 0.1140])
|
||||||
#kernel = np.array([[-1, 1, -1], [1, 7, 1], [-1, 1, -1]])
|
#kernel = np.array([[-1, 1, -1], [1, 7, 1], [-1, 1, -1]])
|
||||||
kernel = np.array([[-1, -1, -1], [-1, 7, -1], [-1, -1, -1]])
|
kernel = np.array([[-1, -1, -1], [-1, 7, -1], [-1, -1, -1]])
|
||||||
laplacian = np.abs(convolve2d(gray, kernel))
|
laplacian = np.abs(self.convolve2d(gray, kernel))
|
||||||
weight = np.power(laplacian, contrast_weight)
|
weight = np.power(laplacian, contrast_weight)
|
||||||
weight_maps.append(weight)
|
weight_maps.append(weight)
|
||||||
|
|
||||||
@ -140,12 +164,11 @@ class NumpyHDR:
|
|||||||
return fused
|
return fused
|
||||||
|
|
||||||
def sequence(self):
|
def sequence(self):
|
||||||
#list = ['hdr/webcam20_3_2023_ev1.jpg','hdr/webcam20_3_2023_ev-1.jpg']
|
|
||||||
hdr_image = self.mertens_fusion(self.input_image ,0.7, 0.01)
|
hdr_image = self.mertens_fusion(self.input_image ,0.7, 0.01)
|
||||||
result = self.simple_clip(hdr_image,1)
|
result = self.simple_clip(hdr_image,1)
|
||||||
image = Image.fromarray(result)
|
image = Image.fromarray(result)
|
||||||
#output_path = f'hdr/webcam_hdr10.jpg'
|
#output_path = f'hdr/webcam_hdr10.jpg'
|
||||||
image.save(self.output_path, quality=self.compress_quality)
|
image.save(f"{self.output_path}_hdr.jpg", quality=self.compress_quality)
|
||||||
|
|
||||||
class NumpyUtility:
|
class NumpyUtility:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user