csdn技能树,答题记录
黑客帝国的图片风格偏绿色,任意图片的每个像素(r,g,b)经过公式转换后即可获得一张“黑客帝国风格图片”:
r = r3/2
g = r4/5
b = r3/2
将图像RGB三通道中的每一个数值都进行处理,只能写双循环。
如果你想使用矩阵相乘的方式,也要先计算三个通道,每个值的 ‘几分之几’,计算每个值的‘几分之几’,还是需要写双循环。还不如开始就直接写双循环。所以这个思路是错误的。
代码如下:
import numpy as np
import cv2
import math
# def hacker(img):
# height, width, channels = img.shape
# for i in range(0, width):
# for j in range(0, height):
# b, g, r = img[i, j]
# hack_b = int(math.pow(b/256.0, 3/2) * 256)
# hack_g = int(math.pow(g/256.0, 4/5) * 256)
# hack_r = int(math.pow(r/256.0, 3/2) * 256)
# img[i, j, 0] = hack_b
# img[i, j, 1] = hack_g
# img[i, j, 2] = hack_r
# def hacker(img):
# height, width, channels = img.shape
# for i in range(0, width):
# for j in range(0, height):
# b, g, r = img[i, j]
# hack_b = int(math.pow(b/256.0, 3/2) * 256)
# hack_g = int(math.pow(g/256.0, 4/5) * 256)
# hack_r = int(math.pow(r/256.0, 3/2) * 256)
# img[i, j] = (hack_b, hack_g, hack_r)
def hacker(img):
height, width, channels = img.shape
for i in range(0, width):
for j in range(0, height):
b, g, r = img.item((i, j, 0)), img.item((i, j, 1)), img.item((i, j, 2))
hack_b = int(math.pow(b / 256.0, 3 / 2) * 256)
hack_g = int(math.pow(g / 256.0, 4 / 5) * 256)
hack_r = int(math.pow(r / 256.0, 3 / 2) * 256)
img.itemset((i, j, 0), hack_b)
img.itemset((i, j, 1), hack_g)
img.itemset((i, j, 2), hack_r)
if __name__ == '__main__':
img_origin = cv2.imread('lena.png', cv2.IMREAD_COLOR)
img = cv2.imread('lena.png', cv2.IMREAD_COLOR)
print(img.size)
print(img.shape)
hacker(img)
print('显示图片,请按任意键退出')
numpy_horizontal_concat = np.concatenate((img_origin, img), axis=1)
cv2.imshow('Lena图片黑客帝国化', numpy_horizontal_concat)
cv2.waitKey()
cv2.destroyAllWindows()