基本操作:图片黑客帝国化

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

默执_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值