OpenCV-Python学习笔记2 变亮、变暗、日落、水印等

在这里插入图片描述

一、调节图像亮度

1. 遍历像素点

调节原理:将像素值变小,全部色彩变暗;将像素值变大,全部色彩变亮。

# -*- coding: utf-8 -*-
import cv2

fn = "test.png"
if __name__ == '__main__':
    print('loading... %s' % fn)
    print(u'显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print(u'正在处理中')
    w = img.shape[1]
    h = img.shape[0]

    # 全部变暗
    for xi in range(0, w):
        for xj in range(0, h):
            # 将像素值整体减少,设为原像素值的20%
            img[xj, xi, 0] = int(img[xj, xi, 0] * 0.2)
            img[xj, xi, 1] = int(img[xj, xi, 1] * 0.2)
            img[xj, xi, 2] = int(img[xj, xi, 2] * 0.2)
        # 显示进度条
        if xi % 10 == 0:
            print('.')
    cv2.namedWindow('dark')
    cv2.imshow('dark', img)
    cv2.waitKey()
    cv2.destroyAllWindows()


这里写图片描述

变亮的代码类似,把像素值整体变大即可,如:

            img[xj,xi,0]=int(img[xj,xi,0]*10.2)
            img[xj,xi,1]=int(img[xj,xi,1]*10.2)
            img[xj,xi,2]=int(img[xj,xi,2]*10.2)

2. OpenCV原生方法来把图像变暗

import cv2
import numpy as np

fn = "test.png"

if __name__ == '__main__':
    print('loading... %s' % fn)
    print('显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print('正在处理中')

    # 将图像的所有像素值降低到原始值的20%
    img_dark = (img * 0.2).clip(0, 255).astype(np.uint8)

    cv2.namedWindow('dark')
    cv2.imshow('dark', img_dark)
    cv2.waitKey()
    cv2.destroyAllWindows()

在这里插入图片描述

二、图像日落效果

1. 遍历

将蓝色值和绿色值设为原来的70%,红色值不变。

# -*- coding: utf-8 -*-
import cv2

fn = "test.png"
if __name__ == '__main__':
    print('loading... %s' % fn)
    print(u'显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print(u'正在处理中')
    w = img.shape[1]
    h = img.shape[0]

    for xi in range(0, w):
        for xj in range(0, h):
            img[xj, xi, 0] = int(img[xj, xi, 0] * 0.7)
            img[xj, xi, 1] = int(img[xj, xi, 1] * 0.7)
        # 显示进度条
        if xi % 10 == 0:
            print('.')
    cv2.namedWindow('sunset')
    cv2.imshow('sunset', img)
    cv2.waitKey()
    cv2.destroyAllWindows()


这里写图片描述

2. transform函数

cv2.transform 是 OpenCV 中用于对图像或点集进行线性变换的函数之一。它可以对图像进行仿射变换或透视变换,也可以对点集进行线性变换,例如旋转、缩放、平移等。

函数声明如下:

dst = cv2.transform(src, m)
  • src 是输入的图像或点集。
  • m 是变换矩阵,通常是一个 2x3 或 3x3 的浮点型矩阵,表示变换的参数。

对于图像变换,m 是一个 2x3 矩阵,定义了一个仿射变换。对于点集变换,m 可以是一个 3x3 矩阵,定义了一个透视变换。

  • 返回值 dst 是变换后的输出图像或点集。

3. OpenCV原生方法实现夕阳效果

下面示例 cv2.transform 来将权重矩阵应用到图像上,实现了夕阳效果。

import cv2
import numpy as np

fn = "test.png"

if __name__ == '__main__':
    print('loading... %s' % fn)
    print('显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print('正在处理中')

    # 创建一个权重矩阵,将红色通道的权重增加,绿色和蓝色通道的权重降低
    weights = np.array([[0.7, 0, 0],
                        [0, 0.7, 0],
                        [0, 0, 1]], dtype=np.float32)

    # 对图像应用权重矩阵
    img_sunset = cv2.transform(img, weights)

    cv2.namedWindow('sunset')
    cv2.imshow('sunset', img_sunset)
    cv2.waitKey()
    cv2.destroyAllWindows()

三、生成负片

1. 每个通道单独处理

# -*- coding: utf-8 -*-
import cv2

fn = "test.png"
if __name__ == '__main__':
    print('loading... %s' % fn)
    print(u'显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print(u'正在处理中')
    w = img.shape[1]
    h = img.shape[0]

    # 生成负片
    b, g, r = cv2.split(img)
    b = 255 - b
    g = 255 - g
    r = 255 - r  # 直接通过索引改变色彩分量
    img[:, :, 0] = b
    img[:, :, 1] = g
    img[:, :, 2] = r

    cv2.namedWindow('nagative')
    cv2.imshow('nagative', img)
    cv2.waitKey()
    cv2.destroyAllWindows()


这里写图片描述

2. 原生方法

import cv2

fn = "test.png"

if __name__ == '__main__':
    print('loading... %s' % fn)
    print('显示原图')
    img = cv2.imread(fn)
    cv2.namedWindow('source')
    cv2.imshow('source', img)

    print('正在处理中')

    # 生成负片
    img_negative = cv2.bitwise_not(img)

    cv2.namedWindow('negative')
    cv2.imshow('negative', img_negative)
    cv2.waitKey()
    cv2.destroyAllWindows()

四、加水印

1. cv2.putText

cv2.putText 函数用于在图像上绘制文本。它允许在图像上添加指定文本,并可以控制文本的字体、大小、颜色、位置等属性。以下是 cv2.putText 函数的参数说明:

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

其中:

  • img: 输入图像,是一个 NumPy 数组。
  • text: 要绘制的文本字符串。
  • org: 文本的起始坐标(x,y),表示文本的左下角位置。
  • fontFace: 字体类型。可以使用预定义的字体类型,例如 cv2.FONT_HERSHEY_SIMPLEX、cv2.FONT_HERSHEY_PLAIN 等。
  • fontScale: 字体大小的缩放因子。
  • color: 文本颜色,通常是一个包含三个整数值的元组或列表(BGR 颜色格式)。
  • thickness: 文本的线条粗细(可选,默认为1)。
  • lineType: 线条类型,控制文本的外观(可选,默认为cv2.LINE_AA)。
  • bottomLeftOrigin: 可选参数,当为 True 时,坐标 org 表示文本左下角的位置;当为 False 时(默认),坐标 org 表示文本左上角的位置。

2. 实现

#-*- coding: utf-8 -*-
import cv2
import numpy as np
fn = "test1.jpg"
if __name__ =='__main__':
    print('loading... %s' % fn)
    print (u'正在处理中')
    img = cv2.imread(fn)
    w = img.shape[1]
    h = img.shape[0]

    cv2.putText(img,"Hello World",(2,20),cv2.FONT_HERSHEY_PLAIN, 2.0, (0,0,0), thickness = 2)
    
    cv2.namedWindow('watermark')
    cv2.imshow('watermark', img)
    cv2.waitKey()
    cv2.destroyAllWindows()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

编程圈子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值