OpenCV(02)图像颜色处理,灰度化,二值化,仿射变换

【OpenCV(01)】基本图像操作、绘制,读取视频

目录

  • 图像颜色加法
  • 灰度化
  • 二值化
  • 仿射变换

图像颜色加法

  • 颜色加法
import cv2 as cv
import numpy as np#读图
cao = cv.imread('E:\hqyj\code\opencv\images\cao.png')
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
#饱和操作 cv.add(img1,img2) np.uint8
dst1 = cv.add(cao,pig)
#numpy直接相加 取模运算 对256取模 250+10=4
dst2 = cao+pig
# print(cao)
# print(pig)
# print(dst1)
cv.imshow('dst1',dst1)
cv.imshow('dst2',dst2)x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x,y)
xy2 = x+y
print(xy1)
print(xy2)dst3 = cv.addWeighted(cao,0.2,pig,0.8,0)
cv.imshow('dst3',dst3)cv.waitKey(0)
cv.destroyAllWindows()
  • 图像转换
import cv2 as cv
import numpy as np# 读取图片
img = cv.imread('E:\hqyj\code\opencv\images\pig.png')
# 颜色转换 cv.cvtColor(img, cv.COLOR_BGR2HSV)->图像,转换方式
# 灰度图
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('gray',gray)
# 转hsv
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('hsv',hsv)
# bgr转rgb
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('rgb',rgb)cv.waitKey(0)
cv.destroyAllWindows()

灰度化

  • 最大值法
import cv2 as cv
import numpy as np#读取图像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循环遍历像素点
for i in range(shape[0]):for j in range(shape[1]):img[i,j] = max(pig[i,j,0],pig[i,j,1],pig[i,j,2])
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 平均值法
import cv2 as cv
import numpy as np#读取图像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#for循环遍历像素点
for i in range(shape[0]):for j in range(shape[1]):#将int():转换为更大的类型,防止溢出img[i,j] =np.uint8((int(pig[i,j,0])+int(pig[i,j,1])+int(pig[i,j,2]))/3)
cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 加权平均值法
import cv2 as cv
import numpy as np#读取图像
pig = cv.imread('E:\hqyj\code\opencv\images\pig.png')
shape = pig.shape   #(h,w,c)
img = np.zeros((shape[0],shape[1]),dtype = np.uint8)
#定义权重
wb,wg,wr = 0.114,0.587,0.299
#for循环遍历像素点
for i in range(shape[0]):for j in range(shape[1]):#将int():转换为更大的类型,防止溢出img[i,j] = round((wb * pig[i,j,0] + wg * pig[i,j,1] + wr * pig[i,j,2])//3)cv.imshow('grey',img)
cv.waitKey(0)
cv.destroyAllWindows()

二值化

  • 二值化(阈值法)格式:阈值法:
    _,binary = cv2.threshold(img,thresh,maxval,type)
    _binary:cv2.threshold 函数返回两个值:一个是计算出的最佳阈值(retval),另一个是阈值处理后的图像(binary),_ 被用来忽略返回值中的第一个元素,即计算出的最佳阈值
    img:输入图像,要进行二值化处理的灰度图。
    thresh:设定的阈值。当像素值大于(或小于,取决于阈值类型)thresh时,该像素被赋予的值。
    type:阈值处理的类型。
  • 自适应二值化格式:
    cv2.adaptiveThreshold(image_np_gray, maxval, adaptiveMethod, thresholdType, blockSize, c)
    其中各个参数的含义如下:
    maxval:最大阈值,一般为255
    adaptiveMethod:小区域阈值的计算方式:
    ADAPTIVE_THRESH_MEAN_C:小区域内取均值
    ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
    thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法
    blockSize:选取的小区域的面积,如7就是7*7的小块。(只能取奇数)
    c:最终阈值等于小区域计算出的阈值再减去此值
import cv2 as cv#读图
flower = cv.imread('E:\hqyj\code\opencv\images\\flower.png')
#灰度化处理
gray = cv.cvtColor(flower,cv.COLOR_BGR2GRAY)
gray = cv.resize(gray,(360,360))
cv.imshow('1.gray',gray)#二值化 1.阈值法  cv.THRESH_BINARY
thresh,binary = cv.threshold(gray,127,255,cv.THRESH_BINARY)
print(thresh)
cv.imshow('2.binary',binary)#2.反阈值法   cv.THRESH_BINARY_INV
_,binary_inv = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
cv.imshow('3.binary_inv',binary_inv)#3.截断阈值法 cv.THRESH_TRUNC
_,binary_trunc = cv.threshold(gray,170,255,cv.THRESH_TRUNC)
cv.imshow('4.binary_trunc',binary_trunc)#4.低阈值零处理法 cv.THRESH_TOZERO
_,binary_tozero = cv.threshold(gray,127,255,cv.THRESH_TOZERO)
cv.imshow('5.binary_tozero',binary_tozero)#5.超阈值零处理法 cv.THRESH_TOZERO_INV
_,binary_tozero_inv = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV)
cv.imshow('6.binary_tozero_inv',binary_tozero_inv)#6.OTSU阈值法
shresh1,otsu=cv.threshold(gray,200,255,cv.THRESH_OTSU)
#7.OTSU+反阈值法
shresh2,otsu_inv = cv.threshold(gray,shresh1,255,cv.THRESH_BINARY_INV)
print(shresh1)
print(shresh2)
cv.imshow('7.otsu',otsu)#自适应二值化 小区域计算 必须只能结合阈值法或反阈值法
#1.取均值
binary_adaptive = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,7,10)
#2.加权求和法 高斯核
adaptive_binary = cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,11,10)
cv.imshow('8.binary_adaptive',binary_adaptive)
cv.imshow('9.adaptive_binary',adaptive_binary)cv.waitKey(0)
cv.destroyAllWindows()

仿射变换

  • 仿射变换流程
    1.读图cv.imread(),调尺寸cv.resize()
    2.获取仿射变换矩阵
1.旋转:M = cv.getRotationMatrix2D(center,angle,scale) center:旋转中心点的坐标,格式为`(x,y)`。angle:旋转角度,单位为度,正值表示逆时针旋转负值表示顺时针旋转。scale:缩放比例,若设为1,则不缩放。
2.平移:M = np.float32([[1,0,tx],[0,1,ty]])
3.缩放:M = np.float32([[sx,0,0],[0,sy,0]])
4.剪切:M = np.float32([[shx,1,0],[1,shy,0]])
  • 旋转
import cv2 as cv#读图
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#获取旋转矩阵 cvv2.getRotationMatrix2D(center,angle,scale) 2x3
M = cv.getRotationMatrix2D((260,260),-45,1)
#仿射变换函数 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 平移
import cv2 as cv
import numpy as np#读图
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定义平移量
tx,ty = 80,120
#定义平移矩阵
M = np.float32([[1,0,tx],[0,1,ty]])
#仿射变换函数 M = cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 缩放
import cv2 as cv
import numpy as np#读图
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定义缩放量
sx,sy = 0.5,0.5
#定义缩放矩阵
M = np.float32([[sx,0,0],[0,sy,0]])
#仿射变换函数 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()
  • 剪切
import cv2 as cv
import numpy as np#读图
cat = cv.imread('E:\hqyj\code\opencv\images\\cat1.png')
cat = cv.resize(cat,(520,520))
#定义缩放量
shx,shy = 0.5,0.5
#定义缩放矩阵
M = np.float32([[shx,1,0],[1,shy,0]])
#仿射变换函数 cv.warpAffine(img,M,(w,h))
img = cv.warpAffine(cat,M,(520,520))
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()

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

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

相关文章

嵌入式——单片机的独立按键

一、目的功能通过开发板上的独立按键k1控制d1指示灯亮灭,k1一次亮再按一次灭。二、硬件原理图三、消抖理解(一)核心原理:当事件被重复触发时,设置一个延迟,只有在该时间内没有新的事件被触发,才…

机器学习的工作流程

🌟 欢迎来到AI奇妙世界! 🌟 亲爱的开发者朋友们,大家好!👋 我是人工智能领域的探索者与分享者,很高兴在CSDN与你们相遇!🎉 在这里,我将持续输出AI前沿技术、实…

聚类里面的一些相关概念介绍阐述

一、性能度量外部指标:聚类结果与某个“参考模型”进行比较;系数: ,其中的 表示样本是否属于某类簇; 指数:,其中 表示样本在两个聚类结果中都是同一类簇, 表示在其中一个聚类结果中…

mmap机制

先看这个 MMAP 机制通俗易懂-CSDN博客 一句话 **mmap(memory map)是操作系统提供的“把文件或设备直接映射到进程虚拟地址空间”的机制,Java 里对应 `MappedByteBuffer`。** --- ### 1. 技术本质 - 系统调用:`mmap()`(POSIX)、`CreateFileMapping`(Windows)。 …

嵌入式硬件篇---驱动板

制作 ESP32 驱动板的核心是 “搭建 ESP32 与外设之间的桥梁”—— 因为 ESP32 的 GPIO 引脚输出电流很小(最大 20mA),无法直接驱动大功率设备(如电机、继电器、电磁阀等),驱动板的作用就是放大电流 / 功率&…

UniappDay01

1.技术架构2.创建uniapp项目 通过HBuilderX创建 官网安装创建uniapp vue3项目安装uniapp vue3的编译器在工具栏启动微信小程序开启服务端口模拟器窗口分离和置顶 通过命令行创建 3.pages.json和tabbar案例 pages.json用来配置路由,导航栏,tabbar等页面类…

子空间投影,投影矩阵,最小二乘法

一、子空间投影 1.1 投影与误差向量b 在 向量a 上的投影即 a 上离 b 最近的点: paTbaTaa p \frac{a^T b}{a^Ta}a paTaaTb​a 我们记 误差 e b - p,显然误差e 和 a 是正交的。 1.2 投影矩阵向量b 在子空间S上的投影是S中离b 最近的向量p。 我们做如下推…

基于FPGA的SPI控制FLASH读写

基于FPGA的SPI控制FLASH读写 文章目录基于FPGA的SPI控制FLASH读写一、SPI简介二、FLASH_M25P16简介信号描述功能操作注意时序三、设计思路框图设计状态机设计四、上板验证1、读ID2、读数据3、扇区擦除写数据五、总结六、代码一、SPI简介 SPI是Serial Peripheral interface的缩…

Pytest 参数化进阶:掌握 parametrize 的多种用法

概述 在自动化测试中,@pytest.mark.parametrize 不仅仅能用来为测试函数提供多组输入数据,还能配合其他功能实现更复杂的测试逻辑。本文将带你深入了解 @pytest.mark.parametrize 的多种常见用法,助你在不同场景下写出更高效、更清晰的测试代码 基础用法回顾:单个参数化 …

K8S 九 安全认证 TLS

目录第九章 安全认证访问控制概述认证管理授权管理 RBACRBACRolerules中的参数RoleBinding9.4 准入控制其他K8S的TLS是什么(DeepSeek)1. 加密通信2. 身份认证(Authentication)3. 数据完整性K8s 中 TLS 的具体应用**1. API Server …

积分兑换小程序Java

某个学校为了激励学生踊跃参加一些社会实践活动,会对参与者给予一些校园积分,学生们获得校园积分后可以使用校园积分在指定的老师那兑换一些学习用具,当前可兑换的物品和对应的积分数量如下:铅笔1分橡皮2分作业本3分文具盒5分为了…

函数指针示例

使用函数指针来调用 printf。下面是对代码的详细解释&#xff1a;&#x1f4c4; 源代码解析#include <stdio.h>int main() {int (*myshow)(const char *, ...); // 声明一个函数指针&#xff0c;指向可变参数函数printf("hello world!\n");myshow printf; /…

不坑盒子突然不见了怎么办?

如果你安装后之前一切正常&#xff0c;突然某天在Office的功能区看不到不坑盒子了&#xff0c;这种是插件被禁用了&#xff0c;重装安装插件、Office都是不能解决的&#xff0c;必须按下面的方法解决。WPS中1.随便打开一个文档&#xff0c;点击文件-选项-信任中心&#xff0c;最…

Java面试全栈通关:从微服务到AI的技术深度解析

Java面试全栈通关&#xff1a;从微服务到AI的技术深度解析 面试现场&#xff1a;大厂技术终面室 面试官&#xff1a;谢飞机同学&#xff0c;今天我们将从基础到架构&#xff0c;全面考察你的Java技术栈掌握程度。请真实展示你的技术水平。 谢飞机&#xff1a;&#xff08;挺胸抬…

《Java 程序设计》第 7 章 - 继承与多态

引言在 Java 面向对象编程中&#xff0c;继承与多态是两大核心特性&#xff0c;它们共同支撑了代码的复用性、扩展性和灵活性。本章将从继承的基本实现开始&#xff0c;逐步深入到方法覆盖、访问控制、抽象类等概念&#xff0c;最终揭示多态的本质与应用。通过大量可运行的代码…

ksql连接数据库免输入密码交互

ksql连接数据库免输入密码交互1. 使用 .pgpass 文件&#xff08;推荐&#xff09;2. 使用环境变量3. 使用连接字符串4. 修改 ksql 的别名&#xff08;简化命令&#xff09;5. 注意事项6. 密码含特殊字符转义在 Kingbase 中使用 ksql 连接数据库时&#xff0c;如果希望避免每次手…

UniApp H5 适配 PC 端新姿势:打造跨设备一致体验

在移动互联网蓬勃发展的今天&#xff0c;很多开发者会选择使用 UniApp 来开发多端应用&#xff0c;尤其是 H5 端&#xff0c;因其无需下载安装即可访问的特性&#xff0c;深受用户喜爱。但 UniApp H5 应用在 PC 端直接打开时&#xff0c;往往会因为屏幕尺寸的巨大差异&#xff…

【MySQL#4】函数 复合查询 内外连接

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 生活总是不会一帆风顺&#xff0c;前进的道路也不会永远一马平川&#xff0c;如何面…

C++常见面试题之一

一、语言基础与内存管理const与constexpr的区别&#xff1f;应用场景&#xff1f; const&#xff1a;运行时常量&#xff0c;修饰变量/函数不可修改。constexpr&#xff1a;编译期常量&#xff08;C11&#xff09;&#xff0c;用于优化计算&#xff08;如数组大小&#xff09;。…

Golang 语言中的指针介绍

介绍&#xff1a;指针式一种数据类型&#xff0c;用来存储值的内存地址&#xff0c;为了便于理解&#xff0c;我们也可以把指针未内存地址&#xff0c;指针类型只占用内存4个或 8 个字节&#xff0c;在Golang 语言中&#xff0c;类型名称加 * 表示改类型的指针类型。指针类型变…