我在倒置_sepia_滤镜时遇到了问题。 倒置滤镜的结果并非预期。
我的逻辑如下: processed_pixel = np.dot(sepia_filter, original_pixel)
这意味着: original_pixel = np.dot(np.linalg.inv(sepia_filter), processed_pixel)
这是我尝试过的代码-我还尝试了其他一些方法,例如分别反转颜色,然后解决线性方程组,但得到相同的结果,因此我认为我不理解某些关键点。
要求:
import numpy as np
from PIL import Image, ImageDraw
棕褐色滤镜代码:
def get_pixel_after_sepia(source, pixel, sepia_filter):
colors = np.array(source.getpixel(pixel))
colors_new = tuple(map(int, np.dot(sepia_filter,colors))) + (255,) # apply filter, transform results to ints, cut to 255
return colors_new
def sepia(source, result_name):
result = Image.new('RGB', source.size)
sepia_filter = np.array([[0.393,0.769,0.189], [0.349,0.686,0.168], [0.272,0.534,0.131]])
# for every pixel
for x in range(source.size[0]):
for y in range(source.size[1]):
new_pixel = get_pixel_after_sepia(source, (x,y), sepia_filter)
result.putpixel((x, y),new_pixel)
result.save(result_name, "JPEG")
return result
反转棕褐色代码:
def get_pixel_before_sepia(source, pixel, inversed_sepia_filter):
colors = np.array(source.getpixel(pixel))
colors_new = tuple(map(int, np.dot(inversed_sepia_filter, colors)))+ (255,)
return colors_new
def inverse_sepia(image_with_sepia, result_file):
result = Image.new('RGB', image_with_sepia.size)
sepia_filter = np.array([[0.393,0.769,0.189], [0.349,0.686,0.168], [0.272,0.534,0.131]])
inverse_sepia_filter = np.linalg.inv(sepia_filter)
for x in range(image_with_sepia.size[0]):
for y in range(image_with_sepia.size[1]):
new_pixel = get_pixel_before_sepia(image_with_sepia, (x,y), inverse_sepia_filter)
result.putpixel((x, y),new_pixel)
result.save(result_file, "JPEG")
return result
函数执行:
image = Image.open("original_image.jpg")
filtered_image = sepia(image, "filtered.jpg") # result_pixel = dot_product(Filter, origin_pixel)
image_after_filter_reversing = inverse_sepia(filtered_image,'restored.jpg' ) # result_pixel = dot_product(Filter^(-1), filtering_result_pixel)
原始图像
滤波后的图像
反转滤波后的图像
我知道由于我们要截取计算结果并将其四舍五入到整数,所以做到完美的反转是不可能的。但我希望反转后的图像能够接近于原始图像。 虽然我对图像处理并不熟悉,但在数学上,这个问题看起来是完全有效的。
filtered_image
输入到inverse_sepia
函数中会发生什么? - mapf