Opencv学习四:图像处理基础

本文介绍了OpenCV中图像的基本表示方法,包括二值图像、灰度图像和RGB彩色图像,详细讲解了像素处理、使用numpy.array访问像素、感兴趣区域(ROI)、通道操作以及如何获取图像属性。内容涵盖二值图像与灰度图像的处理、彩色图像的通道访问和修改,以及ROI的选取和通道的拆分与合并。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、图像的基本表示方法

本文要熟练掌握Numpy库,尤其是Numpy.arry库,是python处理图像的基础

vs2017+python+opencv配置:https://blog.youkuaiyun.com/qq_43440703/article/details/88375609

1.二值图像

二值图像是指仅仅包含黑色和白色两种颜色的图像。

2.灰度图像

二值图像虽然表示起来简单方便,但是因为仅有两种颜色,所以表示起来不够细腻,如果用灰度图像,就采用了更多的数值体现不同的颜色,因此图像细节信息更加丰富。

通常,计算机会将灰度图像处理为256个灰度集,用数值[0,255]来表示。其中,数值“255”表示纯白色,数值“0”表示纯黑色,其余的数值表示从纯白到纯黑之间不同级别的灰度。

3.彩色图像(RGB)

相比二值图像和灰度图像,彩色图像是很常见的,它可以表现更丰富的细节信息。

在RGB色彩空间中,存在R(red,红色)通道,G(green,绿色)通道和B(blue,蓝色)通道,共三个通道。每个彩色通道值的范围都在[0,255]之间,我们用这三个色彩通道的组合表示颜色。

一般来说,在RGB色彩空间中,图像通道的顺序是R→G→B;在opencv中,通道的顺序是B→G→R。我们在处理图像是需要将图像进行类型转换,比如|:将灰度图像处理为二值图像,将彩色图像处理为灰度图像等。

二、像素处理

像素是图像构成的基本单位。

1.二值图像及灰度图像

在Opencv中,最小的数据类型是无符号的8位数,因此,Opencv中并没有二值图像这种类型,二值图像通常是通过处理后得到的,0表示黑色,255表示白色。

可以将二值图像理解为特殊的灰度图像,在面向Python的Opencv中,图像就是Numpy库中的数组。例如image[0,0]访问图像image第0行第0列位置上的像素点。

例如,读取一个灰度图像,对其像素进行访问、修改,具体代码如下:

import cv2
img = cv2.imread("C:\\Users\\asus\\Desktop\\lena.bmp",0)
cv2.imshow("before",img)
for i in range(10,100):
    for j in range(80,100):
        img[i,j]=255              #将10~99行与80~99列交叉区域的像素值设置为255
cv2.imshow("after",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2.彩色图像

RGB模式的彩色图像读入Opencv中进行处理时,会依次读取BGR通道的像素点。例如,可以使用image[0,0,0]访问图像image的B通道内的第0行第0列上的像素点,式中:

  • 第1个索引表示第0行。
  • 第2个索引表示第0列。
  • 第3个索引表示第0个颜色通道。

例如,使用Numpy生成一个三维数组,用来观察三个通道值的变化情况。

import numpy as np
import cv2
img=np.zeros((300,300,3),dtype=np.uint8)
img[:,0:100,0]=255
img[:,100:200,1]=255
img[:,200:300,2]=255
print("img=\n",img)
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

读取一副彩色图像,并对其像素进行访问、修改,具体代码如下:

import cv2
img = cv2.imread("C:\\Users\\asus\\Desktop\\logo.png")
cv2.imshow("before",img)
print("访问 img[0,0]=",img[0,0])#访问img上第0行第0列位置BGR三个像素点
print("访问 img[0,0,0]=",img[0,0,0])#
print("访问 img[0,0,1]=",img[0,0,1])
print("访问 img[0,0,2]=",img[0,0,2])
print("访问 img[50,0]=",img[50,0])
print("访问 img[100,0]=",img[100,0])
#区域一
for i in range(0,50):          #宽度
    for j in range(0,100):     #长度
        for k in range(0,3):
            img[i,j,k]=255

# 区域二
for i in range(50, 100):
    for j in range(0, 100):
            img[i, j] = [128,128,128]

# 区域三
for i in range(100, 150):
    for j in range(0, 100):
            img[i, j] = 0

cv2.imshow("after",img)
print("修改后 img[0,0]=",img[0,0])
print("修改后 img[0,0,0]=",img[0,0,0])
print("修改后 img[0,0,1]=",img[0,0,1])
print("修改后 img[0,0,2]=",img[0,0,2])
print("修改后 img[50,0]=",img[50,0])
print("修改后 img[100,0]=",img[100,0])
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

三、使用numpy.array访问像素

1.二值图像及灰度图像

上文我们说过,可以将二值图像理解为特殊的灰度图像,所以下面我们仅讨论灰度图像。

读取一副灰度图像,并对其像素值进行访问和修改,代码如下:

import cv2
img = cv2.imread("C:\\Users\\asus\\Desktop\\lena.bmp",0)
print("读取像素点img.item(3,2)=",img.item(3,2))
img.itemset((3,2),255)          #修改第三行第二列的像素值为255
print("修改后像素点img.item(3,2)=",img.item(3,2))
cv2.imshow("before",img)
for i in range(10,100):
    for j in range(80,100):
        img.itemset((i,j),255)
cv2.imshow("after",img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2.彩色图像

接下来我们处理彩色图像,对它的像素进行访问和修改,代码如下:

import cv2
import numpy as np
img = cv2.imread("C:\\Users\\asus\\Desktop\\logo.png")
cv2.imshow("before",img)
print("访问像素点img.item(0,0,0)=",img.item(0,0,0))
print("访问像素点img.item(0,0,1)=",img.item(0,0,1))
print("访问像素点img.item(0,0,2)=",img.item(0,0,2))
for i in range(0,50):
    for j in range(0,100):
        for k in range(0,3):
            img.itemset((i,j,k),255)
cv2.imshow("after",img)
print("修改后像素点img.item(0,0,0)=",img.item(0,0,0))
print("修改后像素点img.item(0,0,1)=",img.item(0,0,1))
print("修改后像素点img.item(0,0,2)=",img.item(0,0,2))
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

四、感兴趣区域(ROI)

在对图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,这个区域被称为感情去区域(ROI)。在设定感兴趣区域后,可以对这个区域进行整体操作。

获取图像的脸部信息。并且显示出来,代码如下:

#灰度图像
import cv2
a = cv2.imread("C:\\Users\\asus\\Desktop\\lena.bmp",cv2.IMREAD_UNCHANGED)
face = a[220:400,250:350]
cv2.imshow("original",a)
cv2.imshow("face",face)
cv2.waitKey(0)
cv2.destroyAllWindows()
#RGB图像
import cv2
import numpy as np
a = cv2.imread("C:\\Users\\asus\\Desktop\\logo.png",cv2.IMREAD_UNCHANGED)
face = np.ones((101,101,3))
face = a[220:400,250:350]
cv2.imshow("original",a)
cv2.imshow("face",face)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

如果我们想把上面的ROI复制到另一张图要怎么做呢?

import cv2
import numpy as np
lena = cv2.imread("C:\\Users\\asus\\Desktop\\logo.png")
songyi = cv2.imread("C:\\Users\\asus\\Desktop\\songyi.png")
cv2.imshow("lena",lena)
cv2.imshow("songyi",songyi)
face = np.ones((101,101,3))
face = lena[220:400,250:350]
songyi[160:340,200:300]=face
cv2.imshow("result",songyi)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

五、通道操作

1.通过cv2.split()函数来拆分图像的通道后合并

import cv2
lena=cv2.imread("C:\\Users\\asus\\Desktop\\logo.png")
b,g,r=cv2.split(lena)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2.通道合并

将三个灰度图像构成一幅彩色图像,用cv2.merge()函数实现

import cv2
import numpy as np
a=cv2.imread("C:\\Users\\asus\\Desktop\\logo.png")
rows,cols,chn=a.shape#求a通道有多少行多少列
b=cv2.split(a)[1]
g=np.zeros((rows,cols),a.dtype)
r=np.zeros((rows,cols),a.dtype)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

六、获取图像属性

  • shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;二值或灰度图像仅返回行、列数。
  • size:返回乳香的像素数目。其值为“行X列X通道数”,灰度图像或者二值图像的通道数为1。
  • dtype:返回图像的数据类型。

下面我们编写程序来观察图像的常用属性值:

import cv2
a = cv2.imread("C:\\Users\\asus\\Desktop\\lena.bmp",cv2.IMREAD_UNCHANGED)
b = cv2.imread("C:\\Users\\asus\\Desktop\\logo.png",cv2.IMREAD_UNCHANGED)
print("图像gary属性:")
print("gary.shape=",a.shape)
print("gary.size=",a.size)
print("gary.dtype=",a.dtype)
print("图像color属性:")
print("color.shape=",b.shape)
print("color.size=",b.size)
print("color.dtype=",b.dtype)

输出结果:

图像gary属性:
gary.shape= (512, 512, 3)
gary.size= 786432
gary.dtype= uint8
图像color属性:
color.shape= (512, 512, 3)
color.size= 786432
color.dtype= uint8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值