四、图片特效

news2024/12/22 20:36:26

目录

  • 一、灰度处理
  • 二、颜色反转
  • 三、马赛克
  • 四、毛玻璃
  • 五、图片融合
  • 六、边缘检测与浮雕效果
    • 1 - 边缘检测
    • 2 - 浮雕效果
  • 七、颜色映射
  • 八、油画效果

一、灰度处理

  • 使用openCV的imread方法实现
import cv2

img0 = cv2.imread('image0.jpg', 0)
img1 = cv2.imread('image0.jpg', 1)
print(img0.shape)
print(img1.shape)
cv2.imshow('src', img0)
cv2.waitKey(0)

在这里插入图片描述

  • 使用openCV的cvtColor方法实现:cvtColor实现颜色空间的转换
import cv2

img = cv2.imread('image0.jpg', 1)
dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 颜色空间转换 1 data 2 BGR gray
cv2.imshow('dst', dst)
cv2.waitKey(0)

  • 利用R=G=B的方式实现:使用(R+G+B)/ 3 赋值给像素点
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B = gray  (R+G+B)/3
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        gray = (int(b) + int(g) + int(r)) / 3
        dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)

  • 使用心理学公式:r * 0.299 + g * 0.587 + b * 0.114
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        b = int(b)
        g = int(g)
        r = int(r)
        gray = r * 0.299 + g * 0.587 + b * 0.114
        dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)

  • 算法优化:浮点数据转换成定点数据;乘除转换成位移计算
    • 这里的系数是按乘以4计算了,如果希望精度更快,可以乘100,1000。。。。。
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B = gray  (R+G+B)/3
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        b = int(b)
        g = int(g)
        r = int(r)
        # 浮点转定点:gray = r * 0.299 + g * 0.587 + b * 0.114
        # 乘除转位移:gray = (r*1+g*2+b*1)/4
        gray = (r + (g << 1) + b) >> 2
        dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

二、颜色反转

  • 灰度图片的颜色反转:255-当前的灰度值
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        grayPixel = gray[i, j]
        dst[i, j] = 255 - grayPixel
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 彩色图片的颜色反转:255-当前通道的颜色值
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        dst[i, j] = (255 - b, 255 - g, 255 - r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

三、马赛克

  • 图片实现马赛克的原理:将一片区局域中的所有的像素保持一致
    • 例如:我们想给一个10 * 10的区域打上马赛克
    • 那么我们取到10*10中左上角点的像素值,替换掉10 * 10的100个像素点
    • 这样就实现了马赛克效果
import cv2

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for m in range(100, 300):
    for n in range(100, 200):
        # pixel ->10*10
        if m % 10 == 0 and n % 10 == 0:
            for i in range(0, 10):
                for j in range(0, 10):
                    (b, g, r) = img[m, n]
                    img[i + m, j + n] = (b, g, r)
cv2.imshow('dst', img)
cv2.waitKey(0)

在这里插入图片描述

四、毛玻璃

  • 毛玻璃的实现原理
    • 马赛克效果我们使用的是左上角的像素点来替换掉其他像素点
    • 而毛玻璃是使用随机的像素点来替换掉当前的像素点
import cv2
import numpy as np
import random

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
mm = 8  # 水平方向上和竖直方向都有可能是8
for m in range(0, height - mm):  # -mm是为了防止矩阵越界,同时这里减了mm,所以生成的时候下方和右方会有很色的边框
    for n in range(0, width - mm):
        index = int(random.random() * 8)  # random.random()是0-1,所以index是0-8
        (b, g, r) = img[m + index, n + index]
        dst[m, n] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

五、图片融合

  • 2张图片融合的计算公式:dst = src1a+src2(1-a),其中a指的是alpha系数
import cv2

img0 = cv2.imread('image0.jpg', 1)
img1 = cv2.imread('image1.jpg', 1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
# ROI感兴趣范围,这个要比2张图片的范围都小
roiH = int(height / 2)
roiW = int(width / 2)
img0ROI = img0[0:roiH, 0:roiW]
img1ROI = img1[0:roiH, 0:roiW]
# dst
dst = cv2.addWeighted(img0ROI, 0.5, img1ROI, 0.5, 0)  # add src1*a+src2*(1-a)
# 1 src1 2 a 3 src2 4 1-a
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

六、边缘检测与浮雕效果

1 - 边缘检测

  • 什么是边缘检测:边缘检测的效果有点类似素描,边缘检测的实质是图像的卷积计算
  • openCV的API方式实现边缘检测的步骤
    • 灰度处理
    • 高斯滤波
    • canny方法
import cv2

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度处理
imgG = cv2.GaussianBlur(gray, (3, 3), 0)  # 高斯滤波
dst = cv2.Canny(img, 50, 50)  # 图片卷积——》th,双阀值
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 源码形式实现边缘检测:sobel算法实现,这里会涉及到如下几个概念
  • sobel算法的算子模板:水平方向、垂直方向
水平方向     垂直方向
[1 2 1          [ 1 0 -1
 0 0 0            2 0 -2
-1 -2 -1 ]        1 0 -1 ]
  • 图片卷积:假设1张图片中的4个像素点为[1 2 3 4],当前的模板是[a b c d],那么卷积的结果:a1+b2+c3+d4 = dst
    • a:竖直方向上的梯度 -> 水平方向上的算子与图片卷积的结果
    • b:水平方向上的梯度 -> 垂直方向上的算子与图片卷积的结果
    • f:阀值,f = sqrt(a * a + b * b)
    • th:判决门限
  • 阀值判决:f > th 是边缘,否则是非边缘
import cv2
import numpy as np
import math

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height - 2):
    for j in range(0, width - 2):
        gy = gray[i, j] * 1 + gray[i, j + 1] * 2 + gray[i, j + 2] * 1 - gray[i + 2, j] * 1 - gray[i + 2, j + 1] * 2 - \
             gray[i + 2, j + 2] * 1
        gx = gray[i, j] + gray[i + 1, j] * 2 + gray[i + 2, j] - gray[i, j + 2] - gray[i + 1, j + 2] * 2 - gray[
            i + 2, j + 2]
        grad = math.sqrt(gx * gx + gy * gy)
        if grad > 50:  # 50为域值
            dst[i, j] = 255
        else:
            dst[i, j] = 0
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

2 - 浮雕效果

  • 浮雕效果计算公式:每一个新的像素值等于相邻像素的像素值之差加上一个恒定值(比如150)
    • newP = gray0 - gray1 + 150
    • 这里加上150是为了增强图片的浮雕灰度等级
    • 相邻像素相减是为了突出灰度的突片及边缘特征
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height):
    for j in range(0, width - 1):
        grayP0 = int(gray[i, j])
        grayP1 = int(gray[i, j + 1])
        newP = grayP0 - grayP1 + 150
        if newP > 255:
            newP = 255
        if newP < 0:
            newP = 0
        dst[i, j] = newP
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

七、颜色映射

  • 颜色映射最简单的实现方式
    • 做一个很大的查找表,根据原始图像的rgb值根据查找表查找一组新的rgb,用新的rgb代替原来像素值
    • 也可以用一些简单的公式完成颜色映射,利用公式的方法可能无法表示一些更为复杂的效果
  • 案例:蓝色与绿色增强
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        b = b * 1.5
        g = g * 1.3
        if b > 255:
            b = 255
        if g > 255:
            g = 255
        dst[i, j] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

八、油画效果

  • 油画效果实现步骤
    • ①.gray 灰度化
    • ②.将图片分割为若干个小方块。统计这些小方块中每个像素的灰度值,比如7 * 7 ,10 * 10
    • ③.将0-255划分段,并将第二步的映射到对应段范围中:如划分4个段,每个段有64个等级。0-63 第1段;64-127第2段
    • ④.例如:这时有一个像素点.灰度值是10,那么他就在0-63这个点
      • 找到每个方块中灰度等级最多的所有像素,count 并求取这些像素的均值
      • 用统计出来的平均值,替代原来的像素值
import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 3), np.uint8)
# 这里从-4开始,所以边界值要从4开始
for i in range(4, height - 4):
    for j in range(4, width - 4):
        array1 = np.zeros(8, np.uint8)
        for m in range(-4, 4):  # 定义8*8的小方块
            for n in range(-4, 4):
                p1 = int(gray[i + m, j + n] / 32)  # 灰度等级划分为8个段,每个为256/8
                array1[p1] = array1[p1] + 1
        currentMax = array1[0]
        l = 0  # 记录是哪个段
        for k in range(0, 8):  # 求最大值
            if currentMax < array1[k]:
                currentMax = array1[k]
                l = k
        # 简化 均值
        for m in range(-4, 4):
            for n in range(-4, 4):
                # l是处于哪一个灰度段,32是它的灰度等级
                # 小于等于下一个灰度段,保证处于范围之内
                if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):
                    (b, g, r) = img[i + m, j + n]
        dst[i, j] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/32449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习笔记(1)基本知识、C语言常用关键字、OLED

STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器 STM32常应用在嵌入式领域&#xff0c;如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 STM32功能强大、性能优异、片上资源丰富、功耗低&#xff0c;是一款经典的嵌入式微控制器 STM32F103C8T6 系…

windows + anaconda 安装PySpark3.0.1

1、背景 Spark作为分布式内存计算框架&#xff0c;可以广泛应用在数据处理、分析等应用场景。因此&#xff0c;希望借助Spark高性能的处理项目中的数据&#xff0c;搭建此开发环境&#xff0c;深入了解Spark的处理能力与实现机制。 2、开发环境 在windows10上使用Anaconda作为…

微信小程序使用github协作

微信小程序github协作所需相关设置 1.点击开发工具右上角的版本管理初识化本地仓库&#xff1a; 2.去github新建一个仓库&#xff0c;复制仓库的ssh的url添加到仓库设置中的远程连接中&#xff1a; 3.在仓库设置中的通用里设置好自己的用户名和邮箱 4.生成ssh key 由于我们使…

web前端网页制作课作业——用DIV+CSS技术设计的家乡旅游主题网站

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

Metabase学习教程:视图-3

掌握条形图可视化 创建条形图并使用可视化设置对其进行自定义。 我们看看创建条形图和编辑条形图的设置&#xff0c;然后谈谈堆积条形图。 创建条形图 您可以使用元数据库的示例数据库。选择新的>问题>原始数据>示例数据库。选择示例数据库的Orders表作为您的数据…

腾讯T4级架构师用21个项目带你吃透379页深度学习TensorFlow实践pdf

前言 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

使用XShell、XFTP连接虚拟机或者服务器教程

文章目录前期准备安装建立连接XFTP部分前期准备 官方网站下载 需要购买&#xff0c;但是我记得我好像是通过邮件发送过来的&#xff0c;应该是那个30天试用版&#xff0c;要是不会操作的话可以评论私我发你网盘。 安装 打开安装包(xshell / xftp &#xff0c;两个软件的安装步…

SpringBoot SpringBoot 开发实用篇 6 监控 6.2 SpringBoot Admin

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇6 监控6.2 SpringBoot Admin6.2.1 可视化监控平台6.2.2 SpringBoot A…

论文阅读-Joint Audio-Visual Deepfake Detection(音视频Deepfake检测)

一、论文信息 论文名称&#xff1a;Joint Audio-Visual Deepfake Detection 会议&#xff1a;ICCV2021 作者团队&#xff1a; 二、动机与创新 动机 Visual deepfake上有许多检测方法和数据集&#xff0c;而对audio deepfake以及visual-audio两种模式之间的deepfake方法较少…

mybatis配置文件

名字&#xff1a; mybatis-config.xml 作用&#xff1a; 配置自己的数据库地址、名字、密码以及mysql驱动 ... <!--配置--> <configuration><!--属性--><properties></properties> <!--全局参数设置--><settings></settings> …

力扣 73. 矩阵置零 C语言实现

题目描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 题目链接 解题思路&#xff1a; 由于题目中提示了哈希表&#xff0c;所以本人想到的方法是建立一个哈希表分别用key和value…

用HTML+CSS仿网易云音乐网站(6个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

绘制路径

QPainterPath&#xff08;绘制器&#xff09; QPainterPath类提供一个容器&#xff0c;可以用来创建图形并且重复使用。绘制器路径是由许多图形构建基块&#xff08;如矩形、椭圆形、直线和曲线&#xff09;组成的对象。构建基块可以连接在封闭的子路径中&#xff0c;例如作为矩…

ALU——调用加法乘法模块

只调用加法模块的仿真图&#xff1a; &#xff08;注&#xff1a;alu_control 为十六进制 001高位加载 src2的低16位加载到高16位上 002算数右移 src1算数右移 &#xff08;高位补1&#xff09; 004逻辑右移 src1逻辑右移 &#xff08;逻辑右移直接补0&#xff09; 008逻辑左移…

MagicPods(在Windows电脑上可以实现airpods2弹窗,查看单个耳机电量、充电仓电量)

1.MagicPods的安装方式 Windows电脑下打开Microsoft Store,进入后搜索Magicpods。然后就可以点击下载。&#xff08;软件的费用是12元&#xff0c;可以先免费试用&#xff09; 有可能会出现&#xff1a;下载任何微软商店应用程序都显示错误代码: 0x80240438 解决方法&#xf…

基于HTML+CSS+JS制作商城(web前端网页制作课作业)---手机主题 7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#…

ER图到关系模型的转换和练习SQL语言

目录 一、实验要求 二、作业1解答 1&#xff0e;ER图 2&#xff0e;关系模型&#xff1a; 三、作业2解答 1. 建表并插入数据 2. 使用查询语句查询相关信息 查询计算机系男生的信息&#xff1a; 查询鹿晗的年龄 查询姓名第二个字为“丽”的同学的信息 按照性别列出男…

跨境人,是继续坚守还是求新变新?(Starday)

与以往相比&#xff0c;跨境电商行业圈有许多让卖家难以想象的负面新闻&#xff0c;从亚马逊封号潮、海运价格暴涨、服务商跑路、跨境电商公司倒闭等新闻常有耳闻&#xff0c;今年黑五等销售季的单量也让人不忍直视&#xff0c;许多跨境人战战兢兢&#xff0c;心中非常焦虑。如…

ANSYS mechanical如何在Workbench环境中使用高性能计算

ANSYS mechanical属于隐式结构有限元分析求解器&#xff0c;一般完成一个有限元分析过程需要前处理、求解和后处理三个步骤。前处理一般在图形工作站上完成&#xff0c;有限元求解可在工作站、集群及SMP 服务器上进行。 对于中小型问题&#xff08;例如1000 万节点以内的ANSYS…

基于Webrtc的视频通话录制功能-Android实现

基于Webrtc的视频通话录制功能-Android实现 webrtc本身并不支持视频通话的录制。 webrtc的sdk只是暴露了视频数据给开发者&#xff0c;而音频数据并没有向外暴露。 因此如果要进行视频通话的录制&#xff0c;需要修改webrtc的sdk&#xff0c;将音频数据暴露出来。 webrtc的下载…