day28图像处理OpenCV

文章目录

  • 一、图像预处理
    • 4 边缘填充
      • 4.1 边界复制(BORDER_REPLICATE)
      • 4.2 边界反射(BORDER_REFLECT)
      • 4.3 边界反射101(BORDER_REFLECT_101)
      • 4.4 边界常数(BORDER_CONSTANT)
      • 4.5 边界包裹(BORDER_WRAP)
      • 4.6案例
    • 5 图像矫正(透视变换)
    • 6 图像色彩空间转换
      • 6.1 颜色加法
      • 6.2 颜色加权加法
      • 6.2 颜色加权加法

一、图像预处理

4 边缘填充

填充边缘?我们以下图为例。
在这里插入图片描述

黑色区域就是需要填充的部分。

4.1 边界复制(BORDER_REPLICATE)

边界复制会将边界处的像素值进行复制,然后作为边界填充的像素值,如下图所示,可以看到四周的像素值都一样。

  • 添加属性 :borderMode=cv.BORDER_REPLICATE
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,
borderMode=cv.BORDER_REPLICATE)

4.2 边界反射(BORDER_REFLECT)

如下图所示,会根据原图的边缘进行反射。

  • 添加属性 :borderMode=cv.BORDER_REFLECT)
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)

4.3 边界反射101(BORDER_REFLECT_101)

与边界反射不同的是,不再反射边缘的像素点,如下图所示。

  • 添加属性 :borderMode=cv.BORDER_REFLECT_101
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)

4.4 边界常数(BORDER_CONSTANT)

当选择边界常数时,还要指定常数值是多少,默认的填充常数值为0,如下图所示。

  • 添加属性 :
    • borderMode=cv.BORDER_CONSTANT
    • borderValue=(0,0,255) 填充的常数值
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,
borderValue=(0,0,255))

4.5 边界包裹(BORDER_WRAP)

无限平移补充。

  • 添加属性 :borderMode=cv.BORDER_WRAP
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)

4.6案例

import cv2 as cv
import numpy as np
# 读取图片
cat = cv.imread("./images/face.png")
h, w = cat.shape[:2]
center = (w // 2, h // 2)# 旋转中心
angle = 45# 旋转角度
M = cv.getRotationMatrix2D(center, angle, 0.5)
# 临近值插值
cat2 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REPLICATE)
# 边界反射/边界为轴,进行翻转插值
cat3 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT)
# 边界反射101/与上面原理一样,只是边界的一排不反射
cat4 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT_101)
# 边界常数---要填写填充值
cat5 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_CONSTANT, borderValue=(255, 0, 0))
# 边界包裹
cat6 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_WRAP)cv.imshow("01",cat2)
cv.imshow("02",cat3)
cv.imshow("03", cat4)
cv.imshow("04", cat5)
cv.imshow("05", cat6)
cv.waitKey(0)
cv.destroyAllWindows()
  • 结果图
    在这里插入图片描述

5 图像矫正(透视变换)

图像矫正的原理是透视变换,下面来介绍一下透视变换的概念。

前面的仿射变换是把一个二维坐标系转换到另一个二维坐标系的过程,转换过程坐标点的相对位置和属性不发生变换,是一个线性变换,该过程只发生旋转和平移过程。因此,一个平行四边形经过仿射变换后还是一个平行四边形。

这里的透视变换是把一个三维图像中的某个区域映射成二维图片,并且是矩形呈现。

与仿射变换一样,透视变换也有自己的透视变换矩阵:
[ X Y Z ] = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] ∗ [ x y 1 ] \begin{array}{l l l}{{\left[\begin{array}{c}{{X}}\\{{Y}}\\{Z} \end{array}\right]=\left[\begin{array}{c c c}{{a_{11}}}&{{a_{12}}}&{{a_{13}}}\\ {{a_{21}}}&{{a_{22}}}&{{a_{23}}}\\ {{a_{31}}}&{{a_{32}}}&{{a_{33}}}\end{array}\right]*\left[\begin{array}{c}{{x}}\\{{y}}\\{{1}}\end{array}\right]}}\end{array} XYZ = a11a21a31a12a22a32a13a23a33 xy1

  • 矩阵生成方式:
  • M=getPerspectiveTransform(np1, np2)
    • np1:数据类型为float32的二维矩阵,存放透视区域的四个点坐标
    • np2:数据类型为float32的二维矩阵,存放原图的四个点坐标

该函数会返回一个透视变换矩阵,得到透视变化矩阵之后,使用warpPerspective()函数即可进行透视变化计算,并得到新的图像。该函

数需要提供如下参数:

  • cv2.warpPerspective(src, M, dsize, flags, borderMode)
    

src:输入图像。

M:透视变换矩阵。这个矩阵可以通过getPerspectiveTransform函数计算得到。

dsize:输出图像的大小。它可以是一个Size对象,也可以是一个二元组。

flags:插值方法的标记。

borderMode:边界填充的模式。

  • 示例:
import cv2 as cv
import numpy as np
img = cv.imread("./images/3.png")
h, w = img.shape[:2]
# 透视变换
# 待取区域的4个坐标
zs, ys, zx, yx = (182, 133), (500, 171), (133, 264), (490, 308)
pts1 = np.float32([zs, ys, zx, yx])
# 原图4个点  (0,0) (w,0) (0,h) (w,h)
pts2 = np.float32([[0, 0], [w, 0], [0, h], [w, h]])
# 获取透视矩阵
M = cv.getPerspectiveTransform(pts1, pts2)
# 计算出新图片(透视处理后的图片)
dst = cv.warpPerspective(img, M, (w, h), flags=cv.INTER_LINEAR, borderMode=cv.BORDER_CONSTANT)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()

6 图像色彩空间转换

OpenCV中,图像色彩空间转换是一个非常基础且重要的操作,就是将图像从一种颜色表示形式转换为另一种表示形式的过程。通过将图像从一个色彩空间转换到另一个色彩空间,可以更好地进行特定类型的图像处理和分析任务。常见的颜色空间包括RGB、HSV、YUV等。

  • 色彩空间转换的作用

    • 提高图像处理效果

    • 节省计算资源

6.1 颜色加法

将两个图片的每个像素点进行相加。

  • 方法1:OpenCV的cv.add()函数
    • 饱和操作,例如:10+250 = 255
  • 方法2:numpy的+运算
    • 取模操作,例如:10+250 = 256 % 260 = 4

6.2 颜色加权加法

img = cv2.addWeighted(src1,alpha,src2,deta,gamma)
  • src1src2:输入图像。
  • alphabeta:两张图象权重,累加=1
  • gamma:亮度调整值。
    • gamma > 0,图像会变亮。
    • gamma < 0,图像会变暗。
  • 取模操作,例如:10+250 = 256 % 260 = 4

6.2 颜色加权加法

img = cv2.addWeighted(src1,alpha,src2,deta,gamma)
  • src1src2:输入图像。
  • alphabeta:两张图象权重,累加=1
  • gamma:亮度调整值。
    • gamma > 0,图像会变亮。
    • gamma < 0,图像会变暗。
    • gamma = 0,则没有额外的亮度调整。

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

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

相关文章

C++ Json-Rpc框架-3项目实现(2)

一.消息分发Dispatcher实现 Dispatcher 就是“消息分发中枢”&#xff1a;根据消息类型 MType&#xff0c;把消息派发给对应的处理函数&#xff08;Handler&#xff09;执行。 初版&#xff1a; #pragma once #include "net.hpp" #include "message.hpp"n…

C++算法优化实战:破解性能瓶颈,提升程序效率

C算法优化实战&#xff1a;破解性能瓶颈&#xff0c;提升程序效率 在现代软件开发中&#xff0c;算法优化是提升程序性能的关键手段之一。无论是在高频交易系统、实时游戏引擎&#xff0c;还是大数据处理平台&#xff0c;算法的高效性直接关系到整体系统的性能与响应速度。C作…

【PostgreSQL教程】PostgreSQL 特别篇之 语言接口连接PHP

博主介绍:✌全网粉丝22W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

山东大学软件学院创新项目实训开发日志(12)之将对话记录保存到数据库中

在之前的功能开发中&#xff0c;已经成功将deepseekAPI接口接入到springbootvue项目中&#xff0c;所以下一步的操作是将对话和消息记录保存到数据库中 在之前的开发日志中提到数据库建表&#xff0c;所以在此刻需要用到两个表&#xff0c;conversation表和message表&#xff…

Spring-注解编程

注解基础概念 1.什么是注解编程 指的是在类或者方法上加入特定的注解(XXX) 完成特定功能的开发 Component public classXXX{} 2.为什么要讲注解编程 1.注解开发方便 代码简洁 开发速度大大提高 2.Spring开发潮流 Spring2.x引入注解 Spring3.x完善注解 Springboot普及 推广注解…

Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)

目录 前言 用户的查询 controller层 添加路由 service层 用户的添加 controller层 添加路由 service层-添加用户 service层-添加用户和租户关系 验证结果 结果 前言 完成租户添加功能后&#xff0c;下一步需要实现租户下的用户管理。基础功能包括&#xff1a;查询租…

基于若依的ruoyi-vue-plus的nbmade-boot在线表单的设计(一)架构方面的设计

希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台 主要目标是类似设计jeecgboot那样的online表单功能,因为online本身没有开源这部分代码,而我设计这个是完全开源的,所以希望大家支持支持,开源不容易。 1、数据库方面设计考虑 是在原来gen_table和…

WebFlux应用中获取x-www-form-urlencoded数据的六种方法

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

[Python基础速成]1-Python规范与核心语法

本系列旨在快速掌握Python&#xff0c;实现能够快速阅读和理解 Python 代码&#xff0c;并在可查阅语法的情况下进行 AI 学习。 本篇先了解一下Python基础知识。 本篇内容较菜鸟教程有所删减、方便快速构建大纲&#xff0c;且加入了PEP 8规范说明等有助于理解和编写代码的说明。…

农民剧团的春天与改变之路

杨天义&#xff0c;男&#xff0c;1966年9月生&#xff0c;中共党员&#xff0c;江西省吉安市吉水县水南农民剧团团长。 杨天义从废品收购起家&#xff0c;凭借自身的努力和奋斗&#xff0c;自筹资金100余万元建设了水南镇的第一座影剧院&#xff0c;组建了江西省吉安市吉水县…

python asyncio 的基本使用

1、引言 asyncio 是 Python 标准库中的一个库&#xff0c;提供了对异步 I/O 、事件循环、协程和任务等异步编程模型的支持。 asyncio 文档 2、进程、线程、协程 线程 线程是操作系统调度的基本单位&#xff0c;同一个进程中的多个线程共享相同的内存空间。线程之间的切换由操…

Leedcode刷题 | Day30_贪心算法04

一、学习任务 452. 用最少数量的箭引爆气球代码随想录435. 无重叠区间763. 划分字母区间 二、具体题目 1.452用最少数量的箭引爆气球452. 用最少数量的箭引爆气球 - 力扣&#xff08;LeetCode&#xff09; 在二维空间中有许多球形的气球。对于每个气球&#xff0c;提供的输…

Ant Design Vue 表格复杂数据合并单元格

Ant Design Vue 表格复杂数据合并单元格 官方合并效果 官方示例 表头只支持列合并&#xff0c;使用 column 里的 colSpan 进行设置。 表格支持行/列合并&#xff0c;使用 render 里的单元格属性 colSpan 或者 rowSpan 设值为 0 时&#xff0c;设置的表格不会渲染。 <temp…

C++ 标准库中的 <algorithm> 头文件算法总结

C 常用 <algorithm> 算法概览 C 标准库中的 <algorithm> 头文件提供了大量有用的算法&#xff0c;主要用于操作容器&#xff08;如 vector, list, array 等&#xff09;。这些算法通常通过迭代器来操作容器元素。 1. 非修改序列操作 std::all_of, std::any_of, s…

程序化广告行业(84/89):4A广告代理公司与行业资质解读

程序化广告行业&#xff08;84/89&#xff09;&#xff1a;4A广告代理公司与行业资质解读 大家好&#xff01;在探索程序化广告行业的道路上&#xff0c;每一次知识的分享都是我们共同进步的阶梯。一直以来&#xff0c;我都希望能和大家携手前行&#xff0c;深入了解这个充满机…

deepin使用autokey添加微信快捷键一键显隐ctrl+alt+w

打开deepin商店&#xff0c;搜索快捷键&#xff0c;找到autokey 快捷键管理&#xff0c;点击安装 点击右键新建文件夹 点击右键新建脚本 打开脚本并添加以下内容 import subprocess import time# ------------------ 配置项 ------------------ WM_CLASS "wechat…

文件内容课堂总结

Spark SQL是Spark用于结构化数据处理的模块&#xff0c;前身是Shark。Shark基于Hive开发&#xff0c;虽提升了SQL-on-Hadoop效率&#xff0c;但对Hive依赖过多。2014年6月1日Shark项目停止开发&#xff0c;团队将资源投入Spark SQL项目。Spark SQL具有诸多优点&#xff0c;如摆…

Zotero PDF Translate 翻译插件使用OpenAI API配置教程

PDF Translate&#xff1a;提升 Zotero 内置 PDF 阅读器的翻译功能 “PDF Translate” 是一款为 Zotero 设计的插件&#xff0c;旨在方便用户在 Zotero 内置的 PDF 阅读器中进行划词或段落翻译&#xff0c;辅助阅读外文文献。 一、 安装插件 下载插件&#xff1a; 访问 PDF T…

火山引擎旗下的产品

用户问的是火山引擎旗下的产品&#xff0c;我需要详细列出各个类别下的产品。首先&#xff0c;我得确认火山引擎有哪些主要业务领域&#xff0c;比如云计算、大数据、人工智能这些。然后&#xff0c;每个领域下具体有哪些产品呢&#xff1f;比如云计算方面可能有云服务器、容器…

C/C++程序中实现Python绑定多种技术路线

在C/C程序中实现Python绑定有多种技术路线&#xff0c;选择合适的方法取决于项目需求、性能要求和开发效率。以下是常见的几种方案&#xff0c;按易用性排序&#xff1a; 1. PyBind11&#xff08;推荐首选&#xff09; 特点&#xff1a;现代C库&#xff0c;语法简洁&#xff0…