Python+OpenCV实现六种常用图像特效

作者:B.Bz 时间:2023-08-02 10:01:43 

图像融合

按照一定的比例将两张图片融合在一起

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

Python+OpenCV实现六种常用图像特效

灰度处理

一张彩色图片通常是由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)

Python+OpenCV实现六种常用图像特效

彩色反转

一样的道理,彩色图片有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)

Python+OpenCV实现六种常用图像特效

马赛克效果

马赛克指现行广为使用的一种图像(视频)处理手段,此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果,因为这种模糊看上去有一个个的小格子组成,便形象的称这种画面为马赛克。其目的通常是使之无法辨认。

Python+OpenCV实现六种常用图像特效

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

Python+OpenCV实现六种常用图像特效

毛玻璃效果

毛玻璃效果和马赛克效果相似,马赛克是:比如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()

Python+OpenCV实现六种常用图像特效

浮雕效果

浮雕效果公式: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()

Python+OpenCV实现六种常用图像特效

来源:https://blog.csdn.net/bjsyc123456/article/details/124718682

标签:Python,OpenCV,图像,特效
0
投稿

猜你喜欢

  • python 正则表达式 概述及常用字符

    2023-03-03 07:16:15
  • python基础教程之序列详解

    2021-05-29 23:52:04
  • 使用Python实现毫秒级抢单功能

    2022-10-17 18:46:16
  • 如何实现让每句话的头一个字母都大写?

    2010-05-24 18:26:00
  • 浅谈python opencv对图像颜色通道进行加减操作溢出

    2021-12-26 11:45:23
  • Python爬取股票交易数据并可视化展示

    2022-02-06 13:13:22
  • Python根据区号生成手机号码的方法

    2022-02-20 21:58:29
  • python标准库学习之sys模块详解

    2021-08-02 02:25:19
  • Python中DataFrame判断两列数据是否相等的方法

    2023-12-09 10:17:37
  • 删除多余的属性 xmlns=""

    2010-08-24 18:41:00
  • numpy.transpose对三维数组的转置方法

    2023-10-11 07:32:36
  • CSS处理斜角导航条的一个例子

    2007-08-27 12:38:00
  • Mysql脏页flush及收缩表空间原理解析

    2024-01-21 23:07:25
  • python连接mongodb操作数据示例(mongodb数据库配置类)

    2023-05-01 17:21:17
  • Windows系统下安装GIt及GIT基本认识和配置

    2023-06-14 20:54:53
  • JavaScript实例--实现计算器

    2024-04-23 09:26:17
  • vue中@keyup.enter失效问题及解决

    2023-07-02 17:01:38
  • XML的简单读取与写入

    2008-09-04 10:35:00
  • Python实现二叉树的最小深度的两种方法

    2022-05-24 03:30:17
  • mysql 5.7.13 安装配置方法图文教程(linux)

    2024-01-27 20:46:37
  • asp之家 网络编程 m.aspxhome.com