Python+OpenCV实现六种常用图像特效
作者:B.Bz 发布时间:2023-08-02 10:01:43
标签:Python,OpenCV,图像,特效
图像融合
按照一定的比例将两张图片融合在一起
addWeighted()方法:
参数1第一张图片矩阵
参数2第一张图片矩阵的权重
参数3第二张图片矩阵
参数4第二张图片矩阵的权重
融合之后的偏移量
进行叠加的两张图片宽高应该相同
叠加之后的像素偏移值如果填的话不要填太大,超过255会导致图像偏白
import cv2
import cv2 as cv
img = cv.imread("img/lena.jpg")
tony = cv.imread("img/tony.jpg", )
# 修改lena图片的宽高 融合图像之前两个图片的宽高要保持一样
height, width = img.shape[0:2]
new_height = int(height * 1.5)
new_width = int(width * 2)
new_img = cv2.resize(img, (new_width, new_height))
# 进行叠加时的插值
dst = cv.addWeighted(new_img, 0.5, tony, 0.5, 0)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()
灰度处理
一张彩 * 片通常是由BGR三个通道叠加而成
为了便于图像特征识别,我们通常会将一张彩 * 片转成灰度图片来进行分析,当我们转成灰 * 片之后,图片中边缘,轮廓特征仍然是能够清晰看到的,况且在这种情况下我们仅需要对单一通道进行分析,会简化很多操作
1.前面说的可以读取图片时以灰度的方式读取
import cv2
img = cv2.imread("img/lena.jpg", cv.IMREAD_GRAYSCALE)
2.BGR转灰度图
import cv2
img = cv2.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 将原图的所有颜色转成灰色
dstImg = cv2.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("dstImg", dstImg)
cv.waitKey(0)
颜色反转
灰度反转
灰度图中每一个像素点都是0~255组成,如果一个像素点为100,反转之后就是255 - 100 = 155
import cv2 as cv
img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 将原图的所有颜色转成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 获取高度和宽度
height, width = dstImg.shape[0:2]
# 遍历每一个像素点
for row in range(height):
for col in range(width):
# 255 - 每一个像素点 = 反转后的颜色
dstImg[row, col] = 255 - dstImg[row, col]
cv.imshow("dstImg", dstImg)
cv.waitKey(0)
彩色反转
一样的道理,彩 * 片有BGR三个颜色通道,每一个颜色都取反
255 - B = B1 255 - G = G1 255 - R = R1
import cv2 as cv
img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
# 将原图的所有颜色转成灰色
dstImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 获取高度和宽度
height, width = dstImg.shape[0:2]
# 遍历每一个像素点
for row in range(height):
for col in range(width):
# 255 - 每一个像素点 = 反转后的颜色
dstImg[row, col] = 255 - dstImg[row, col]
cv.imshow("dstImg", dstImg)
cv.waitKey(0)
马赛克效果
马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克。其目的通常是使之无法辨认。
import cv2
# 读取图片 cv2读取出的图片都是一个二维矩阵
img = cv2.imread('./img/lena.jpg', cv2.IMREAD_COLOR)
# 切片 两个点的坐标可以截取图片
# x1:x2,y1:y2 截取眼睛部分
img1 = img[180:250, 180:310]
# 获取到高度和宽度
height, width = img1.shape[0:2]
# 遍历每一个像素点
for row in range(height):
for col in range(width):
# 如果正好为10的倍数的行并且是10的倍数的列
if row % 10 == 0 and col % 10 == 0:
# 获取到这个像素点的bgr三原色
b, g, r = img1[row, col]
# 遍历这个像素点旁边的100个像素点 都等于中间这个像素点
for i in range(10):
for j in range(10):
img1[row + i, col + j] = b, g, r
cv2.imshow('img', img)
cv2.imwrite('msk_lena.jpg', img)
cv2.waitKey()
毛玻璃效果
毛玻璃效果和马赛克效果相似,马赛克是:比如4*4的像素点内所有像素点都与第一个像素点颜色一样,毛玻璃效果为遍历每一个像素点,在该像素点附近随机选取一个颜色值替换。
偏移量越大越模糊
import random
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
height, width = img.shape[0:2]
new_img = np.zeros_like(img, np.uint8)
# 定义偏移量
offset = 6
# 遍历每一个像素点
for row in range(height):
for col in range(width):
# 定义不超过1的随机值与offset相乘
index = int(random.random() * offset)
# 获取到随机完的行号和列号 如果不超过总高度就使用随机的行 如果超过就使用高度-1
random_row = row + index if row + index < height else height - 1
random_col = col + index if col + index < width else width - 1
# 赋值颜色
b, g, r = img[random_row, random_col]
new_img[row, col] = b, g, r
cv2.imshow('img', img)
cv2.imshow('new_img', new_img)
cv2.waitKey()
浮雕效果
浮雕效果公式:new_gray = gray0-gray1+120
加120是为了增加灰度值
import cv2
import numpy as np
img = cv2.imread('./lena.jpg')
# 获取高度宽度
height, width = img.shape[0:2]
# 转为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
new_img = np.zeros_like(gray_img, np.uint8)
# 遍历每一个像素点
for row in range(height):
# 因为要获取相邻的像素点 防止下标越界提前遍历的时候宽度-1
for col in range(width - 1):
# 获取像素点的像素值
gray0 = gray_img[row, col]
# 获取相邻像素点的像素值
gray1 = gray_img[row, col + 1]
# 使用浮雕效果的公式
new_gray = int(gray0) - int(gray1) + 120
# 判断新的灰度值是否越界
if new_gray > 255:
new_gray = 255
elif new_gray < 0:
new_gray = 0
# 赋值
new_img[row, col] = new_gray
cv2.imshow('img', img)
cv2.imshow('new_img', new_img)
cv2.waitKey()
来源:https://blog.csdn.net/bjsyc123456/article/details/124718682
0
投稿
猜你喜欢
- 一般情况下,导出超时可能都是以下三种情况:一、sql语句复杂,查询时间过长;二、处理查询后数据逻辑冗余;三、数据量过大导致响应超时。接下来分
- 在设计网页时,没有比页面的外观更重要的了。所以,如果发现设计人员十分关注字体及字体大小,我并不感到惊奇。使用CSS来编辑字体有各种各样的方法
- 如何使用表单发送电子邮件?邮件也可以用表单格式发送吗?我见一个朋友这样做的。当然可以,用OCXMail就行:formToEmail.htm&
- 在更改列顺序之前,你需要考虑是否的确需要更改表中的列顺序。SQL的核心要点是从数据存储格式获取应用。总应指定检索数据的顺序。在下面的第1条语
- 本文介绍了prototype.js常用函数及其使用方法例子说明函数名
- 用下列方法可以做到: main.htm<html><body><form action="
- FCKeditor是目前互联网上最好的在线编辑器,功能强大,支持IE 5.5+ (Windows), Fire
- 1 逻辑数据库和表的设计数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序
- 相信很多人在使用正则表达式的时候都会遇到如下的语句:通过查阅正则表达式的API文档可以了解到正则表达式的语法知识:很多小伙伴就会产生疑问为什
- 不知各位是否有手写代码的习惯。例如:要在一个单元格插入一段CSS代码,或者一段Javascript代码,怎么做才比较快捷方便呢?虽然Drea
- 本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:MyISAM 和 Innodb,文中设计的 MySQL
- 树型结构在我们应用程序中还是很常见的,比如文件目录,BBS,权限设置,部门设置等。这些数据信息都采用层次型结构,而在我们现在的关系型数据库中
- 1.由于设置了slave的配置信息,mysql在数据库data目录下生成master.info,所以如有要修改相关slave的配置要先删除该
- 当系统出现故障时,只要存在数据日志那么就可以利用它来恢复数据解决数据库故障。作为SQL Server数据库管理员,了解数据日志文件的作用,以
- 大家在用asp开发程序的时候,有时候会碰到以下的错误提示:Active Server Pages 错误 'ASP 0141'
- AdobeAdobe公司的标识1982年,40多岁的程序员约翰·沃诺克(John Warnock)和查尔斯·杰斯克(Charles Gesc
- A 定义数组有两种方式:DIM和REDIM。DIM定义的是固定个数、数据类型的数组;而REDIM则不同,它可以定义不同类型的数据,也可以定义
- 问:Perl下应当如何连接Access数据库答:首先需要安装Win32-ODBC模块,具体的步骤如下:1:从TOOLS栏目中下载Win32-
- 一:队列配置队列的配置文件放置在config/queue.php文件中,laravel框架中支持的队列驱动有:sync, database,
- 最近发现各大类库都能利用div.innerHTML=HTML片断来生成节点元素,再把它们插入到目标元素的各个位置上。这东西实际上就是inse