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