当前位置: 首页 > article >正文

【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 np

a = 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 np

a = 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 np

a = 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 np

a = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shape

b = 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 np

a = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shape

b = 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 np

a = cv2.imread("image\\lenacolor.png")

rows,cols,chn = a.shape

b = 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.kler.cn/a/412867.html

相关文章:

  • 斐波那契堆与二叉堆在Prim算法中的性能比较:稀疏图与稠密图的分析
  • 「Mac畅玩鸿蒙与硬件33」UI互动应用篇10 - 数字猜谜游戏
  • 【不定长滑动窗口】【灵神题单】【刷题笔记】
  • wireshark基础
  • 基于Springboot的心灵治愈交流平台系统的设计与实现
  • burp功能介绍
  • Python中的简单爬虫
  • 三菱PLC 梯形图内嵌ST编程说明(GX WORKS3)
  • DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放
  • 2024/11/27学习日志
  • 微软正在测试 Windows 11 对第三方密钥的支持
  • AI时代的PPT革命:智能生成PPT工具为何备受青睐?
  • Goland或Idea启动报错
  • 泷羽sec学习打卡-shell命令3
  • leetcode hot100【LeetCode 136. 只出现一次的数字】java实现
  • 网络安全问题与大忌
  • CAD 2008安装教程软件下载
  • 【离散数学】集合关于其上等价关系的商集【1】
  • 基于Java的小程序电商商城开源设计源码
  • Android Glide批量加载Bitmap,拼接组装大Bitmap,更新单个AppCompatImageView,Kotlin(2)
  • 使用Azure合成语音,解放嘴巴(bushi)
  • 基于STM32的无人机自主导航与避障系统
  • Ajax与Vue初步学习
  • Ubuntu系统为同一逻辑网口配置不同网段的IP
  • Dubbo Golang开发微服务
  • DMS2024|思腾合力受邀参加第二届CCF数字医学大会