【Opencv学习】PART1-图像基础处理

目录

一、图像的读入、显示和保存

1、读入图像

imread函数

范例

显示控制参数

2、显示图像

imshow函数

范例

 tips

waitkey函数

含义

delay参数: 

tips

destoryAllWindows函数

3、保存图像

imwrite函数

范例

实操

01-读入显示保存

代码

结果

二、图像处理入门

1、图像分类(图像构成)

二值图像

灰度图像

彩色图像

RGB三原色

三层组成

tips

2、图片转换

RGB转灰度

灰度转二值

三、像素处理

1、读取像素

2、修改像素值

灰度图像

BGR图像

实操

01-读取像素值

代码

结果

02-统一修改像素值

代码

结果

03-逐个修改像素值

代码

结果

04-修改指定通道值

代码1

结果1

代码2

结果2

代码3​

结果3

代码4

结果4

05-修改多行像素

改窗口前代码

改窗口后代码(窗口过大,难对比)

结果对比

四、使用numpy访问像素

1、读取像素

item函数

灰度图像,返回灰度值

BGR图像,返回值为B、G、R的值

2、修改像素值

itemset函数

灰度图像

BGR图像(需要分别对通道进行设置)

实操

01-灰度图像

代码

结果

02-彩色图像

代码

结果

03-多通道

代码

结果

五、获取图像属性

1、shape参数

灰度图像

彩色图像

2、size参数

3、dtype参数

具体代码

实操

01-获取图像属性

代码

结果

六、感兴趣区域ROI

概念解析

简单解析

具体代码

实操

01-提取出感兴趣区域ROI

代码

结果

02-复制感兴趣区域至原图

代码

结果

03-复制感兴趣区域到其他图

代码

​编辑结果

七、通道的拆分与合并

1、拆分通道

直接使用opencv

用split函数

具体例子

01-一次性拆分

代码

结果

02-每次只拆一个通道

代码

2、合并通道​编辑

01-merge函数

代码

结果

02-B通道与其余都为0的通道合并

代码

结果

03-G通道与其余都为0的通道合并

代码

04-R通道与其余都为0的通道合并

代码

结果

具体实施

01拆分-直接opencv拆分

代码

结果

02拆分-split函数拆分-一次性拆分

代码

结果

03-拆分-split函数拆分-分通道拆分

代码

结果

04-拆分合并-拆分通道展示并合并

代码

结果

错误结果(RGB)

05-合并

代码

结果

八、加法运算

1、Numpy加法

2、Opencv加法

二者比较

比较代码

实操

01-图像加法

代码

结果

九、图像融合

概念解析

二者对比

addWeighted函数

实操

01-图像融合

代码

结果

结果(1:1)

结果(0.3:0.8)

结果(0.7:0.4)


一、图像的读入、显示和保存

1、读入图像

imread函数

  • retval = cv2.imread(文件名[,显示控制参数])
  • 文件名:完整文件名
  • 参数:
    • cv.IMREAD_UNCHANGED
    • cv.IMREAD_GRAYSCALE
    • cv.IMREAD_COLOR

  • 显示控制参数:指定显示的类型(如不改变显示,以灰度形式显示,以彩色形式显示…)

     用一个参数显示文件名即可

范例:

        img = cv2.imread("d:\\image.jpg")

        解析:

        cv2:库名

        第一个\:转义字符

        第二个\:

显示控制参数:

第二个参数的形式多样

2、显示图像

imshow函数

  • None = cv2.imshow(窗口名,图像名)

范例:

        cv2.imshow(“demo”,image)

 tips:

        窗口名不要中文,中文可能不显示

waitkey函数

  • retval = cv2.waitKey(    [,delay])
  • 含义:等待,靠delay来控制;什么都没有为无限等待
  • delay参数:  
    • delay > 0,等待delay毫秒
    • delay < 0,等待键盘单击
    • delay = 0,无限等待
tips:

        通常设为 cv2.watKey(0)

        自行手动关闭窗口

destoryAllWindows函数

  • cv2.destoryAllWindows()
  • 功能:删除所有窗口

3、保存图像

imwrite函数

  • retval = cv2.imwrite(文件地址,文件名)
范例:

        cv2.imwrite("D:\\test.jpg",img)

        意为将img保存为D盘中test.jpg

实操

01-读入显示保存

代码:

        import cv2:导入opencv的库

结果:

显示结果

保存结果

二、图像处理入门

  • 图像是由像素构成的

1、图像分类(图像构成)

三种类别(如下图):

  • 二值图像-任何一点非黑即白(只有两个值)
  • 灰度图像-白黑灰三色(把灰度分成256个不同的颜色,比二值图像更细腻)
  • RGB图像-一般指彩色图像

二值图像

值要么是0,要么是1,不能为别的值

灰度图像

最小值为0,最大值为255

某一像素点值为0,即纯黑色;值为255,即纯白;0~255间为灰色;所以一共分成256种颜色

彩色图像

RGB三原色

计算机中所有颜色都可以通过不同比例的RGB三种颜色混合得到

例:RGB三原色每一个值也为0~255间

三层组成(一个位置三个值,与二值图像、灰度图像都不同)

tips:

opencv里正常的通道顺序为BGR

与通常的RGB不一样,所以通常需要调整顺序

2、图片转换

RGB转灰度

通过加权的计算,不会丢失信息,确保RGB都保存在灰度图像里

灰度转二值

三、像素处理

1、读取像素

  • 返回值=图像(位置参数)

例:

  • 灰度图像,返回灰度值

        p = img[88,142]

        #访问第88行,142列的像素

        print(p)

  • BGR图像,返回B、G、R的值->(B,G,R)三个通道

        -指定通道

        blue = img[78,125,0]                green = img[78,125,1]                red = img[78,125,2]

        print(blue)                                 print(green)                                print(red)

        -无指定通道

        p = img[78,125]

        print(p)

        

2、修改像素值

  • 像素 = 新值

  • 灰度图像

        print(img[88,99])

        img[88,99] = 255 

        print(img[88,99]) ->验证成不成功

  • BGR图像

        -分通道去设置image的通道

        print(img[88,99,0])

        print(img[88,99,1])

        print(img[88,99,2])

        img([88,99,0])=255

        img([88,99,1])=255

        img([88,99,2])=255

        print(img[88,99,0])

        print(img[88,99,1])

        print(img[88,99,2])

        -不分通道处理

        print(img[88,99])

        img[88,99] = [255,255,255] ->三个通道一次性赋值

        print(img[88,99])

实操

01-读取像素值

代码:

结果:

02-统一修改像素值

代码:

结果:

03-逐个修改像素值

代码:

结果:

04-修改指定通道值

代码1

结果1

代码2

结果2

代码3
结果3

代码4

无通道3,只有012

结果4

05-修改多行像素

改窗口前代码:

改窗口后代码:(窗口过大,难对比)

结果对比:

[255,255,255]

[0,0,0]



[255,0,0]

[0,255,0]

[0,0,255]

四、使用numpy访问像素

1、读取像素

item函数

  • 用item函数来读取位置参数
  • 返回值 = 图像.item(位置参数)

  • 灰度图像,返回灰度值

        p = img.item(88,142)

        print(p)

  • BGR图像,返回值为B、G、R的值

        blue = img.item(78,125,0)

        green = img.item(78,125,1)

        red = img.item(78,125,2)

        print(blue)

        pirnt(green)

        print(red)

2、修改像素值

itemset函数

  • 图像名.itemset(位置,新值)

  • 灰度图像

        print(img.item(88,99))  ->打印初始值

        img.itemset((88,99),255)

        print(img.item(88,99)) ->打印更改值

  • BGR图像(需要分别对通道进行设置)

        print(img.item(88,99,0)) ->打印初始值

        print(img.item(88,99,1))

        print(img.item(88,99,2))

        img.itemset((88,99,0),255)

        img.itemset((88,99,1),255)

        img.itemset((88,99,2),255)

        print(img.item(88,99,0)) ->打印更改值

        print(img.item(88,99,1))

        print(img.item(88,99,2))

实操

01-灰度图像

代码

结果

02-彩色图像

代码

结果

03-多通道

代码

结果

五、获取图像属性

1、shape参数

        表示形状:行、列、通道数

        shape可以获得图像的形状,返回包括行数、列数、通道数的元组

        灰度         返回行数,列数

        彩色         返回行数,列数,通道数

灰度图像

        import cv2

        img1 = cv2.imread('灰度图像')

        print(img1,shape)

        ##(512,512)        ->(行数,列数)

彩色图像

        import cv2

        img2 = cv2.imread('彩色图像')

        print(img2,shape)

        ##(5121,512,3)         ->(行数,列数,通道数)

2、size参数

        表示像素数目

        size可以获取图像的像素目录

        ·灰度        返回:行数*列数

        ·彩色        返回:行数*列数*通道数

        import cv2

        img = cv2.imread('图像名')

        print(img.size)

        ## 786432

3、dtype参数

        表示图像的数据类型

        dtype返回的是图像的数据类型      

        import cv2

        img = cv2.imread('图像名称')

        print(img.dtype)

        ## unit8

具体代码

结果

实操

01-获取图像属性

代码

结果

六、感兴趣区域ROI

概念解析

·ROI(region of internet),感兴趣区域

·从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域

·可以通过各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理

若只对脸部感兴趣,则圈画部分为感兴趣区域ROI

简单解析

通过下标的方式具体引用

复制感兴趣块

具体代码

-找感兴趣块

-复制感兴趣块

-保存感兴趣块,并存入另一图中

实操

01-提取出感兴趣区域ROI

代码

结果

02-复制感兴趣区域至原图

代码

结果

03-复制感兴趣区域到其他图

代码
结果

七、通道的拆分与合并

1、拆分通道

  • 直接使用opencv

        import cv2

        img = cv2.imread('图像名')

        b = img[ : , : , 0]

        g = img[ : , : ,1]

        r = img[ : , : , 2]

  • 用split函数

        import cv2

        img = cv2.imread('图像名')

        b,g,r = cv2.split(img)

具体例子

01-一次性拆分
代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")b,g,r = cv2.split(a)cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)cv2.waitKey()
cv2.destoryAllWindows()

   

结果

每个通道都是独立的,为灰度图像

02-每次只拆一个通道

代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")b = cv2.split(a)[0]
g = cv2.split(a)[1]
r = cv2.split(a)[2]



2、合并通道

01-merge函数

(注意合并的顺序!!)(原用BGR图像分离)

代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")
b,g,r = cv2.split(a)bgr = cv2.merge([b,g,r]) ->BGR通道
rgb = cv2.merge([r,g,b]) ->RGB通道cv2.imshow("BGR",bgr)
cv2.imshow("RGB",rgb)cv2.waitKey(0)
cv2.destoryAllWindows()
结果

(左BGR通道,右RGB通道)

02-B通道与其余都为0的通道合并

代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shapeb = cv2.split(a)[0]
g = np.zeros((rows,cols),dtype = a.dtype)
r  = np.zeros((rows,cols),dtype = a.dtype)
m = cv2.merge([b,g,r])cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果

03-G通道与其余都为0的通道合并

代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shapeb = np.zeros((rows,cols),dtype = a.dtype)
g = cv2.split(a)[1]
r  = np.zeros((rows,cols),dtype = a.dtype)m = cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()

结果

04-R通道与其余都为0的通道合并

代码
import cv2
import numpy as npa = cv2.imread("image\\lenacolor.png")rows,cols,chn = a.shapeb = np.zeros((rows,cols),dtype = a.dtype)
g = np.zeros((rows,cols),dtype = a.dtype)
r  = cv2.split(a)[2]m = cv2.merge([b,g,r])cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果

具体实施

01拆分-直接opencv拆分

代码

结果

02拆分-split函数拆分-一次性拆分

代码

显数值

显图像

结果

结果1

结果2(B、G、R)

03-拆分-split函数拆分-分通道拆分

代码

结果

04-拆分合并-拆分通道展示并合并

代码

结果

错误结果(RGB)

05-合并

代码

结果

(分别split->B、G、R,其余为0)(同时对应通道0、1、2)

八、加法运算

1、Numpy加法

  • 取模加法

        运算方式:结果=图像1+图像2

        最大值为255

2、Opencv加法

  • 饱和运算

        运算方式:结果=cv2.add(图像1,图像2)

二者比较

Numpy加法与Opencv加法比较(大于255的点,Numpy为黑,Opencv为白)

各自用的场合不同

注意点:参与运算的图像大小、类型必须一致;没法对不同大小的图像进行加法运算

比较代码

实操

01-图像加法

代码

结果

九、图像融合

概念解析

·将2张或2张以上的图像信息的融合到1张图像上

·融合的图像含有更多的信息、能够更方便人来观察或者计算机处理

例子:两模糊得清晰

不是简单相加,是需要对两个图像进行一系列的算法处理(以不同权重的方式)

二者对比

权重系数不一样,加法都为1,融合为不同

·图像加法:结果图像=图像1+图像2

        img = img1 + img2

·图像融合:结果图像=图像1*系数1+图像2*系数2+亮度调节量

(亮度调节值可以为0)

        img = img1*0.3 + img2*0.7 +18

addWeighted函数

主要为五个参数(第一个参数,及其系数,第二个参数,及其系数)

        dst = cv.addWeighted(sc1,alpha,sc2,beta,gamma)

        dst = src1*alpha + src2*beta + gamma;

·参数gamma不能省略

例:

源代码

效果图

实操

01-图像融合

代码

结果
结果(1:1)

结果(0.3:0.8)

结果(0.7:0.4)

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

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

相关文章

硬中断关闭后的堆栈抓取方法

一、背景 性能和稳定性是一个计算机工程里的一个永恒的主题。其中尤其稳定性这块的问题发现和问题分析及问题解决就依赖合适的对系统的观测的手段&#xff0c;帮助我们发现问题&#xff0c;识别问题原因最后才能解决问题。稳定性问题里尤其底层问题里&#xff0c;除了panic问题…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验&#xff0c;同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏&#xff0c;排除了清晰度和功耗之间的平衡问题。该芯片…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…

ETAS工具导入DBC生成Com协议栈

文章目录 前言DBC配置关键属性Cobra参数配置Cobra使用isolar工程配置总结前言 ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项 DBC配置关键属性 对于普通Com报文,配置为周期发送,及其周期,NmMessage配置为No,示例如下: 对…

图形化界面MySQL(MySQL)(超级详细)

1.官网地址 MySQL :: Download MySQL Workbench 1.1在Linux直接点击NO thanks..... 下载完后是这个页面 1.2任何远端登录&#xff0c;再把jj数据库给授权 1.3建立新用户 进行连接 点击这个就运行了 只执行show tables&#xff1b;要先选中 圆圈处支持自己输入 点击这个就执…

vulhub靶场与pikachu靶场

一、搭建vulhub 环境&#xff1a;kaildocker 1.1 提权&#xff1a; :::color4 sudo su #权限升级为root ::: 1.2更新软件&#xff1a; :::color4 apt-get update ::: (此处我已更新过) 1.3安装HTTPS协议和CA证书&#xff1a; :::color4 apt-get install -y apt-transpo…

计算机网络socket编程(6)_TCP实网络编程现 Command_server

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记&#xff0c;欢迎大家在评论…

D78【 python 接口自动化学习】- python基础之HTTP

day78 pycharm创建项目并进行接口请求 学习日期&#xff1a;20241124 学习目标&#xff1a;http定义及实战 -- pycharm创建项目并进行接口请求 学习笔记&#xff1a; 安装requests 安装方式&#xff1a;pip/pip3 install requests 官网教程&#xff1a;Requests: HTTP fo…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络&#xff0c;想使用wireshark抓包工具抓取Android手机网络日志&#xff0c;有以下两种连接方法&#xff1a; Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑&#xff0c;并在开发者模式中启用 USB 网络共享。 查看设备连接信…

Docker安装ubuntu1604

首先pull镜像 sudo docker run -d -P m.daocloud.io/docker.io/library/ubuntu:16.04国内使用小技巧&#xff1a; https://github.com/DaoCloud/public-image-mirror pull完成之后查看 sudo docker images 运行docker sudo docker run -d -v /mnt/e:/mnt/e m.daocloud.io/…

【数据结构与算法】树和二叉树

【数据结构与算法】树和二叉树 文章目录 【数据结构与算法】树和二叉树前言一、树的基本概念二、二叉树的基本概念三、二叉树的递归遍历四、二叉树的编程五、二叉树的非递归遍历总结 前言 本篇文章将讲到树的基本概念&#xff0c;二叉树的基本概念&#xff0c;二叉树的递归遍历…

大语言模型---Llama7B和Llama8B的区别;模型参数量;权重文件的不同;嵌入层权重的不同;输入序列长度的不同;应用场景

文章目录 1.概要2. 模型参数量3. 权重文件的不同4. 嵌入层权重的不同5. 输入序列长度的不同6. 应用场景 1.概要 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是由Meta开发的一系列语言模型&#xff0c;其中不同版本的参数量&#xff08;如7B、8B等&#xff09;…

Android Binder技术概览

Android中的Binder是一种基于远程过程调用&#xff08;Remote Procedure Call, RPC&#xff09;的轻量级通信机制&#xff0c;核心用于 Android 系统中的进程间通信&#xff08;Inter-Process Communication, IPC&#xff09;。Binder 是 Android 系统中不可或缺的一部分&#…

NoteExpress导入知网论文无法智能更新题录的处理方法

知网论文下载下来一般为“标题_作者.caj”&#xff0c;只要在导入文件时对字段默认值进行设置就行了。 其他地方下载的论文也是一样&#xff0c;根据文件名称设置字段默认值。

搜索二维矩阵

搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c…

Mysql中的 TEXT 和 BLOB 解析

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

2024强网拟态决赛-eBeepf

漏洞分析与利用 分析后面看情况吧&#xff0c;有时间再写吧&#xff0c;先贴个利用脚本&#xff1a; #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <…

Duolingo「多邻国」v6.9.0 解锁Max高级版

前言 Duolingo是一个特别有名的学语言的应用软件&#xff0c;你可以用它来学西班牙语、法语、德语、意大利语、俄语等等好多种语言。当然&#xff0c;用它来学英语也是个不错的选择。 安装环境 [名称]&#xff1a;Duolingo「多邻国」 [大小]&#xff1a;79MB [版本]&#x…

鸿蒙开发-音视频

Media Kit 特点 一般场合的音视频处理&#xff0c;可以直接使用系统集成的Video组件&#xff0c;不过外观和功能自定义程度低Media kit&#xff1a;轻量媒体引擎&#xff0c;系统资源占用低支持音视频播放/录制&#xff0c;pipeline灵活拼装&#xff0c;插件化扩展source/demu…

基于SSM的婚庆管理系统+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、商家&#xff08;婚庆公司&#xff09;、用户功能模块&#xff1a;管理员&#xff08;用户管理、商家管理、摄影风格管理、礼服款式管理、案例管理、婚车品牌管理、婚纱拍摄管理、策划服务管理、婚宴酒店管理、婚车套餐管理、在线咨询…