一.获取图像属性

1.形状-shape
通过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。如下图所示:

# -- coding:utf-8 --
import cv2
import numpy

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#获取图像形状
print(img.shape)#显示图像
cv2.imshow("Demo", img)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:(445L, 670L, 3L),该图共445行、670列像素,3个通道。

2.像素数目-size
通过size关键字获取图像的像素数目,其中灰度图像返回行数 * 列数,彩色图像返回行数 * 列数 * 通道数。代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#获取图像形状
print(img.shape)#获取像素数目
print(img.size)

输出结果:
(445L, 670L, 3L)
894450

3.图像类型-dtype
通过dtype关键字获取图像的数据类型,通常返回uint8。代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#获取图像形状
print(img.shape)#获取像素数目
print(img.size)#获取图像类型
print(img.dtype)输出结果:
(445L, 670L, 3L)
894450
uint8

二.获取感兴趣ROI区域

ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出需要处理的区域。可以通过各种算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被广泛应用于热点地图、人脸识别、图像分割等领域。

通过像素矩阵可以直接获取ROI区域,如img[200:400, 200:400]。

代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#定义200*100矩阵 3对应BGR
face = np.ones((200, 100, 3))#显示原始图像
cv2.imshow("Demo", img)#显示ROI区域
face = img[200:400, 200:300]
cv2.imshow("face", face)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

下面将提取的ROI图像进行融合实验,代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#定义300*100矩阵 3对应BGR
face = np.ones((200, 200, 3))#显示原始图像
cv2.imshow("Demo", img)#显示ROI区域
face = img[100:300, 150:350]
img[0:200,0:200] = face
cv2.imshow("face", img)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

将提取的头部融合至图像左上角部分,如下图所示:

如果想将两张图像进行融合,只需再读取一张图像即可,方法原理类似。 实现代码如下:

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = cv2.imread("test3.jpg", cv2.IMREAD_UNCHANGED)#定义300*100矩阵 3对应BGR
face = np.ones((200, 200, 3))#显示原始图像
cv2.imshow("Demo", img)#显示ROI区域
face = img[100:300, 150:350]
test[400:600,400:600] = face
cv2.imshow("Pic", test)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

三.图像通道处理

1.通道拆分
OpenCV读取的彩色图像由B、G、R三原色组成,可以通过下面代码获取不同的通道。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]

也可以使用split()函数拆分通道,下面是拆分不同通道再显示的代码。

# -- coding:utf-8 --
import cv2
import numpy as np

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#拆分通道
b, g, r = cv2.split(img)#显示原始图像
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

也可以获取不同的通道,核心代码如下所示: b = cv2.split(a)[0] g = cv2.split(a)[1] r = cv2.split(a)[2]

2.通道合并
图像通道合并主要调用merge()函数实现,核心代码如下:
m = cv2.merge([b, g, r])

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)#拆分通道
b, g, r = cv2.split(img)#合并通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

注意,如果是合并[r,g,b]三通道,则显示如下所示,因OpenCV是按照BGR进行读取的。
b, g, r = cv2.split(img)
m = cv2.merge([r, g, b])
cv2.imshow(“Merge”, m)

同时,可以提取图像的不同颜色,提取B颜色通道,G、B通道设置为0,则显示蓝色。代码如下所示:

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape#拆分通道
b = cv2.split(img)[0]
g = np.zeros((rows,cols),dtype=img.dtype)
r = np.zeros((rows,cols),dtype=img.dtype)#合并通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

蓝色通道输出结果如下所示:

绿色通道核心代码及输出结果如下所示:
rows, cols, chn = img.shape
b = np.zeros((rows,cols),dtype=img.dtype)
g = cv2.split(img)[1]
r = np.zeros((rows,cols),dtype=img.dtype)
m = cv2.merge([b, g, r])

红色通道修改方法与上面类似。

图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波

Python调用OpenCV实现图像平滑,
1.图像平滑
2.均值滤波
3.方框滤波
4.高斯滤波
5.中值滤波
一.图像平滑

1.图像增强
图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:(参考课件和左飞的《数字图像处理》)
2.图像平滑
图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
简单平滑-邻域平均法

3.邻域平均法
图像简单平滑是指通过邻域简单平均对图像进行平滑处理的方法,用这种方法在一定程度上消除原始图像中的噪声、降低原始图像对比度的作用。它利用卷积运算对图像邻域的像素灰度进行平均,从而达到减小图像中噪声影响、降低图像对比度的目的。
但邻域平均值主要缺点是在降低噪声的同时使图像变得模糊,特别在边缘和细节处,而且邻域越大,在去噪能力增强的同时模糊程度越严重。

首先给出为图像增加噪声的代码。

# -*- coding:utf-8 -*-
import cv2
import numpy as np#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape#加噪声
for i in range(5000):    x = np.random.randint(0, rows) y = np.random.randint(0, cols)    img[x,y,:] = 255cv2.imshow("noise", img)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下所示:

二.均值滤波

1.原理
均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值。例如下图中,红色点的像素值为蓝色背景区域像素值之和除25。
其中红色区域的像素值均值滤波处理过程为: ((197+25+106+156+159)+ (149+40+107+5+71)+ (163+198+226+223+156)+ (222+37+68+193+157)+ (42+72+250+41+75)) / 25

其中5*5的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像。
提取1/25可以将核转换为如下形式:
2.代码
Python调用OpenCV实现均值滤波的核心函数如下:
result = cv2.blur(原始图像,核大小)
其中,核大小是以(宽度,高度)表示的元祖形式。常见的形式包括:核大小(3,3)和(5,5)。
代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test01.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#均值滤波
result = cv2.blur(source, (5,5))#显示图形
titles = ['Source Image', 'Blur Image']
images = [source, result]
for i in xrange(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()  

输出结果如下图所示:

核设置为(10,10)和(20,20)会让图像变得更加模糊。
如果设置为(1,1)处理结果就是原图,核中每个权重值相同,称为均值。
三.方框滤波

方框滤波和均值滤波核基本一致,区别是需不需要均一化处理。OpenCV调用boxFilter()函数实现方框滤波。函数如下:
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
其中,目标图像深度是int类型,通常用“-1”表示与原始图像一直;核大小主要包括(3,3)和(5,5),如下所示。
normalize属性表示是否对目标图像进行归一化处理。当normalize为true时需要执行均值化处理,当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易发生溢出,溢出时均为白色,对应像素值为255。

在图像简单平滑中,算法利用卷积模板逐一处理图像中每个像素,这一过程可以形象地比作对原始图像的像素一一进行过滤整理,在图像处理中把邻域像素逐一处理的算法过程称为滤波器。平滑线性滤波器的工作原理是利用模板对邻域内像素灰度进行加权平均,也称为均值滤波器。
代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test01.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波
result = cv2.boxFilter(source, -1, (5,5), normalize=1)#显示图形
titles = ['Source Image', 'BoxFilter Image']
images = [source, result]
for i in xrange(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()  

代码中使用5*5的核,normalize=1表示进行归一化处理,此时与均值滤波相同,输出结果如下图所示:

下面是图像左上角处理前后的像素结果:

print(source[0:3, 0:3, 0])
#[[115 180 106]
# [ 83 152  72]
# [ 55  58  55]]
print(result[0:3, 0:3, 0])
#[[92 90 78]
# [92 89 77]
# [82 80 72]]

如果省略参数normalize,则默认是进行归一化处理。如果normalize=0则不进行归一化处理,像素值为周围像素之和,图像更多为白色。

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test01.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#方框滤波
result = cv2.boxFilter(source, -1, (5,5), normalize=0)#显示图形
titles = ['Source Image', 'BoxFilter Image']
images = [source, result]
for i in xrange(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show() 

输出结果如下图所示:
上图很多像素为白色,因为图像求和结果几乎都是255。如果设置的是2*2矩阵,只取四个像素结果要好些。
result = cv2.boxFilter(source, -1, (2,2), normalize=0)

四.高斯滤波

为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3 * 3 和 5 * 5 领域的高斯模板。
高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。
Python中OpenCV主要调用GaussianBlur函数,如下:
dst = cv2.GaussianBlur(src, ksize, sigmaX)
其中,src表示原始图像,ksize表示核大小,sigmaX表示X方向方差。注意,核大小(N, N)必须是奇数,X方向方差主要控制权重。
代码如下:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test01.png')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#高斯滤波
result = cv2.GaussianBlur(source, (3,3), 0)#显示图形
titles = ['Source Image', 'GaussianBlur Image']
images = [source, result]
for i in xrange(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray')  plt.title(titles[i])  plt.xticks([]),plt.yticks([])
plt.show()  

输出结果如下所示:

如果使用15*15的核,则图形将更加模糊。
中值滤波

1.概念
在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。 例如选择滤波的窗口如下图,是一个一维的窗口,待处理像素的灰度取这个模板中灰度的中值,滤波过程如下:
如下图所示,将临近像素按照大小排列,取排序像素中位于中间位置的值作为中值滤波的像素值。

2.代码
OpenCV主要调用medianBlur()函数实现中值滤波。图像平滑里中值滤波的效果最好。
dst = cv2.medianBlur(src, ksize)
其中,src表示源文件,ksize表示核大小。核必须是大于1的奇数,如3、5、7等。
代码如下所示:

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt#读取图片
img = cv2.imread('test01.png')#高斯滤波
result = cv2.medianBlur(img, 3)#显示图像
cv2.imshow("source img", img)
cv2.imshow("medianBlur", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

常用的窗口还有方形、十字形、圆形和环形。不同形状的窗口产生不同的滤波效果,方形和圆形窗口适合外轮廓线较长的物体图像,而十字形窗口对有尖顶角状的图像效果好。中值滤波对于消除孤立点和线段的干扰十分有用,尤其是对于二进噪声,但对消除高斯噪声的影响效果不佳。对于一些细节较多的复杂图像,可以多次使用不同的中值滤波。

[Python图像处理] .获取图像属性、兴趣ROI区域及通道处理相关推荐

  1. opencv python3 找图片色块_Python 图像处理 OpenCV (3):图像属性、图像感兴趣 ROI 区域及通道处理...

    前文传送门: 图像属性 图像属性包括行数,列数和通道数,图像数据类型,像素数等. 1. 形状:shape 图像的形状可以通过 shape 关键字进行获取,使用 shape 关键的后,获取的信息包括行数 ...

  2. [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  3. python+opencv 获取图像属性,获取图像感兴趣区域ROI

    1.获取图像属性 1.1获取图像形状 img.shape:灰度图像返回高.宽两个参数,彩色图像返回高.宽.通道数三个参数 读取彩色图片: # -*- coding:utf-8 -*- import c ...

  4. OpenCV图像处理--获取图像属性

    原图: 获取图像常用属性 通过调用Mat类的公有成员变量,可以获取图像的标志位.尺寸.行高.列宽.图像维度等常用属性. Mat类矩阵类型说明 Mat类矩阵类型可以是CV_8UC3.CV_16SC1-C ...

  5. 英伟达DeepStream学习笔记45——deepstream 绘制感兴趣ROI区域 绘制矩形框

    最近在做红绿灯的识别,需要先根据红绿灯在高精度地图位置并映射到图像的ROI进行过滤. 参考代码在gstnvdspreprocess.cpp 1305行. #ifdef DRAW_ROISNvDsDis ...

  6. python识别图片坐标查看器_Opencv/python图像处理后如何获取检测区域的坐标

    这是我使用的代码.最后,我不得不重新调整我的数据帧,但只是为了更好地阅读.我认为我的代码有很多可能的改进,但是我很高兴我的代码行为足够好地满足我的需要.在import cv2 import numpy ...

  7. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. [Python图像处理] 三十一.图像点运算处理两万字详细总结(灰度化处理、阈值化处理)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. [Python图像处理] 三十.图像量化及采样处理万字详细总结(推荐)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  10. 万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. (0089)iOS开发之iOS应用间相互跳转(URL Scheme)
  2. 【安全漏洞】苹果取证的分析
  3. PPT 下载 | 桑文锋:数据化建设的时代机遇
  4. 【Android】UI架构
  5. Linux中的一个命令行计算器bc简介
  6. 是男人就过 8 题--Pony.AI 题 - A String Game
  7. Gradle入门:创建二进制分发
  8. FHS(Filesystem Hierarchy Standard 文件系统层次化标准)
  9. HTML中文网页乱码问题
  10. Linux 安装flash
  11. Oracle ORA-01861: literal does not match format string
  12. javajavaScript常见校验器
  13. Adobe Reader XI已停止工作的解决办法
  14. 编译-POCO C++支持iOS平台的静态库
  15. 蓝牙mesh中的TTL解读
  16. MyISAM与InnoDB存储引擎
  17. 第三章:IP地址加掩码讲解和ping命令运用
  18. winds_mysql8.0安装方法
  19. 指纹识别所运用的计算机技术,门禁系统的指纹识别功能所运用的计算机技术有哪些...
  20. java mapper xml if_bug篇——Mybatis中Mapper.xml文件的if判断问题

热门文章

  1. java 多个引用指向同一个对象(含案例图解)
  2. Android native memory leak detect (Android native内存泄露检测)
  3. setFitView的zoom只是整数,导致缩放尺寸不合适的解决方案
  4. js基础-8-浅拷贝和深拷贝
  5. Linux设置时间和硬件时间
  6. bootstrape常用标签_bootstrap 常用data
  7. php和js封装函数,介绍javascript-ecma中的几种封装函数
  8. 搜狗浏览器智慧版_4月浏览器份额榜单出炉:Edge登上第二、Chrome第一无人撼动...
  9. python修改html,Python爬虫精简步骤 HTML基础
  10. python计算地球重量_python – 在Tensorflow中使用Earth Mover的Distance作为损失函数