一.软件使用与基础入门

12 篇文章 0 订阅 ¥9.90 ¥99.00
本文介绍了OpenCV中读取、显示和保存图像的方法,包括使用`imread()`、`namedWindow()`、`imshow()`、`imwrite()`等函数。此外,详细讲解了图像处理的基础,如像素访问、感兴趣区域(ROI)选择、通道操作等,涵盖二值图像、灰度图像和彩色图像的处理。还探讨了如何使用Numpy数组进行像素操作,以及如何拆分和合并图像通道。
摘要由CSDN通过智能技术生成

软件使用:
实例:学会使用anaconda,spyder,opencv
**

1.读取图像

**
imread(filename,flag)
filename:完整的图像文件名;
flag:读取标记来控制读取文件的类型;默认值是1(IMREAD_COLOR)
imread可以读取到几乎所有格式的图像文件
例子:读取一副图像
import cv2
#以unchange读取color.png文件
img = cv2.imread(“color.jpg”,-1)

**

2.图像显示

2.1 namedWindow(winname,para):用来指定名称的窗口,winname即窗口名,para是窗口的标识,一般默认为WINDOW_AUTOSIZE,设置为WINDOW_NORMAL可以显示为可调整大小的窗口。
2.2 imshow(winname,mat),winname是要创建的窗口名,mat是要显示的图像。
例子:接着1中的例子,将读取到图像进行显示。
import cv2
#读取图像
img = cv2.imread(“color.jpg”)
#创建窗口
cv2.namedWindow(“lesson1”,cv2.WINDOW_NORMAL)
#显示图像到窗口
cv2.imshow(“lesson1”,img)

也可以不创建窗口,直接把图像显示到窗口
cv2.imshow(winname,picture)

cv2.waitKey(0)
cv2.destroyAllWindows()

2.3waiKey()函数
函数 cv2.waitKey()用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。
retval=cv2.waitKey([delay])
式中:
● retval表示返回值。如果没有按键被按下,则返回−1;如果有按键被按下,则返回该按键的ASCII码。
● delay 表示等待键盘触发的时间,单位是 ms。当该值是负数或者零时,表示无限等待。该值默认为0。
2.4 destroyWindow函数
函数cv2.destroyWindow()用来释放(销毁)指定窗口,其语法格式为:
None=cv2.destroyWindow(winname)
其中,winname是窗口的名称。
2.5destroyAllWindows函数
函数cv2.destroyAllWindows()用来释放(销毁)所有窗口,其语法格式为:
None=cv2.destroyAllWindows()
**
**

3.保存图像

cv2.imwrite(),用来保存图像,
retval=cv2.imwrite(filename,img[,params])
式中:
● retval是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
● filename是要保存的目标文件的完整路径名,包含文件扩展名。
● img是被保存图像的名称。
● params是保存类型参数

**
**

4.图像处理基础

4.1图像的基本表示方法
在计算机中,通过一个栅格状排列的数据集来表示和处理图像,将图像划分为一个个小方块,每一个小方块就是一个独立的处理单位,成为像素点。

4.1.1二值图像:仅仅包含黑色和白色两种颜色的图像。在处理时,将黑色像素点处理为0,白色像素点处理为1。

4.1.2灰度图像:数值255表示纯白,数值0表示纯黑,其余的数值表示从纯白到纯黑不同级别的灰度。

注意:有些情况下,也会使用8位二进制值来表示一幅二值图像。这种情况下,使用灰度值255表示白色、灰度值0表示黑色。此时,该二值图像内仅有数值0和数值255两种类型的灰度值(灰度级),不存在其他灰度值的像素点。

4.1.3彩色图像:在 RGB 色彩空间中,存在 R(red,红色)通道、G(green,绿色)通道和 B(blue,蓝色)通道,共三个通道。每个色彩通道值的范围都在[0,255]之间,我们用这三个色彩通道的组合表示颜色。通常用一个三维数组来表示一幅RGB色彩空间的彩色图像
注意:opencv中,通道的顺序不是RGB而是BGR。第1通道保存B通道信息,第2通道保存G通道信息,第3通道保存R通道信息。

4.2 像素处理
4.2.1二值图像与灰度图像
需要说明的是,在OpenCV中,最小的数据类型是无符号的8位数
在OpenCV中实际上并没有二值图像这种数据类型,二值图像经常是通过处理得到的,然后使用0表示黑色,使用255表示白色。
分析可知,可以将图像理解为一个矩阵,在面向Python的OpenCV(OpenCV for Python)中,图像就是 Numpy 库中的数组。一个 OpenCV 灰度图像是一个二维数组,可以使用表达式访问其中的像素值。例如,可以使用image[0,0]访问图像image第0行第0列位置上的像素点。第0行第0列位于图像的左上角,其中第1个索引表示第0行,第2个索引表示第0列。
例子1:
import cv2 as cv
import numpy as np

#定义一个图像8*8
img = np.zeros((10000,10000),dtype =np.uint8)
#show this img
cv.imshow(“one”,img)
#修改图像 黑改为白
img[0,3] = 255
cv.imshow(“two”,img)

cv.waitKey(0)
cv.destroyAllWindows()

例子2:读取一个灰度图像并对其进行访问修改
import cv2 as cv
import numpy as np

#读取图像
img = cv.imread(“moliniao.jpg”,0)
#修改图像
for i in range(10,100):
for j in range(80,100):
img[i,j] = 255
#显示修改完的图像
cv.imshow(“window”,img)

cv.waitKey(0)
cv.destroyAllWindows()
原始图像
效果
4.2.2彩色图像
RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。

img[0,0,0]:访问的是B通道内第0行第0列上的像素点
img[0,0,1]:访问的是G通道内第0行第0列上的像素点
img[0,0,2]:访问的是R通道内第0行第0列上的像素点
img[0,0]:访问图像img第0行第0列像素点的BGR值。

例子:使用Numpy生成三维数组,用来观察三个通道值的变化情况。
在这里插入图片描述
**import cv2 as cv
import numpy as np

#creat blue
blue = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
blue[:,:,0] = 255
print(“blue =\n”,blue)
cv.imshow(“blue”,blue)
#以上就是一副蓝色图片

#creat green
green = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
green[:,:,1] = 255
print(“green =\n”,green)
cv.imshow(“green”,green)
#以上就是一副绿色图片

#creat red
red = np.zeros((300,300,3),dtype = np.uint8)
#将通道blue设置为255,其他两色为初始值0
red[:,:,2] = 100
print(“red =\n”,red)
cv.imshow(“red”,red)
#以上就是一副绿色图片

cv.waitKey(0)
cv.destroyAllWindows()

4.3使用numpy.array访问像素

numpy.array提供了item()****和itemset()****函数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够更大幅度地提高处理效率。

函数item()能够更加高效地访问图像的像素点,该函数的语法格式为:
item(行,列)
函数itemset()可以用来修改像素值,其语法格式为:itemset(索引值,新值)

4.3.1二值图像与灰度图像
使用 Numpy 生成一个二维随机数组,用来模拟一幅灰度图像,并对其像素进行访问、修改。
使用Numpy中的random.randint可以生成一个随机数组,该随机数组对应一幅灰度图像。

例子1:随机生成一个灰度图
import cv2 as cv
import numpy as np

#生成0-256范围内数值的256*256的矩阵
img = np.random.randint(0,256,size = [256,256],dtype = np.uint8)
print(“img=\n”,img)
print(“读取像素点img.item(3,2)=”,img.item(3,2))
cv.imshow(“demo”,img)
print(“img=\n”,img)
print(“读取像素点img.item(3,2)=”,img.item(3,2))

cv.waitKey(0)
cv.destroyAllWindows()

例子2:读取一幅灰度图像,并对其像素值进行访问、修改。

import cv2 as cv
import numpy as np

img = cv.imread("moliniao.jpg",0)
cv.imshow("demo0",img)
print("img = \n",img)
#读取,修改单个像素点
print("读取像素点img.item(3,2) = \n",img.item(3,2))
img.itemset((3,2) ,255)
print("修改后的像素点img.item(3,2) = img.item(3,2)",img.item(3,2))
cv.imshow("demo1",img)

#测试修改一个区域
for i in range(10,100):
    for j in range(50,100):
        img.itemset((i,j),255)

cv.imshow("demo2",img)
cv.waitKey(0)
cv.destroyAllWindows()  

在这里插入图片描述
4.3.2彩色图像
函数item()访问RGB模式图像的像素值时,其语法格式为:
item(行,列,通道)
函数itemset()修改(设置)RGB模式图像的像素值时,其语法格式为:
itemset((行,列,通道),(目标值))

注意:需要注意,针对 RGB 图像的访问,必须同时指定行、列以及行列索引(通道)
例子1:
#使用Numpy生成一个由随机数构成的三维数组,用来模拟一幅RGB色彩空间的彩色图像,并使用函数item()和itemset()来访问和修改它。
import cv2 as cv
import numpy as np
#creat img
img = np.random.randint(10,99,size = [2,4,3],dtype = np.uint8)
print(“img =\n”,img)
print(“读取像素点img[1,2,0]=\n”,img.item(1,2,0))
print(“读取像素点img[0,1,2]=\n”,img.item(0,1,2))
print(“读取像素点img[1,0,2]=\n”,img.item(1,0,2))
#修改
img.itemset((1,2,0),255)
img.itemset((0,1,2),255)
img.itemset((1,0,2),255)

print(“修改后读取像素点img[1,2,0]=”,img.item(1,2,0))
print(“修改后读取像素点img[0,1,2]=”,img.item(0,1,2))
print(“修改后读取像素点img[1,0,2]=”,img.item(1,0,2))
在这里插入图片描述
例子2:生成一幅彩色图像,让其中的像素值均为随机数。
#生成一幅彩色图像,让其中的像素值均为随机数。
import cv2 as cv
import numpy as np

BGR_img = np.random.randint(0,256,size =[256,256,3],dtype = np.uint8)
cv.imshow(“BGR_IMG”,BGR_img)

cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
例子3:读取一幅彩色图像,并对其像素进行访问、修改。
#读取一幅彩色图像,并对其像素进行访问、修改。
import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)
print(“img.item(0,0,0)= \n”,img.item(0,0,0))
print(“img.item(0,0,1)= \n”,img.item(0,0,1))
print(“img.item(0,0,2)= \n”,img.item(0,0,2))
cv.imshow(“before”,img)

for i in range(100,200):
for j in range(100,200):
for k in range(0,3):
img.itemset((i,j,k),0)#黑色
cv.imshow(“black”,img)

for i in range(100,200):
for j in range(100,200):
for k in range(0,3):
img.itemset((i,j,k),255)#白色
cv.imshow(“white”,img)
在这里插入图片描述
**

4.4感兴趣的区域(region of interest,ROI)

**
在图像处理过程中,我们可能会对图像的某一个特定区域感兴趣,该区域被称为感兴趣区域(Region of Interest,ROI)。在设定感兴趣区域ROI后,就可以对该区域进行整体操作。例如,将一个感兴趣区域A赋值给变量B后,可以将该变量B赋值给另外一个区域C,从而达到在区域C内复制区域A的目的。
操作:a = img[200:400,200:400]
img[200:400,400:600] =a
就可复制a到区域

例子1:获取图像内的区域,在新窗口显示

import cv2 as cv
import numpy as np

img = cv.imread("color.jpg")
face = img[80:240,100:300]

cv.imshow("original",img)
cv.imshow("face",face)
       
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
例子2:对上例中脸部打码
import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)
face = img[80:240,100:300]
mask = np.random.randint(0,256,size = (160,200,3),dtype = np.uint8)
img[80:240,100:300] = mask
cv.imshow(“aftermask”,img)

cv.waitKey(0)
cv.destroyAllWindows()
在这里插入图片描述
**

4.5通道操作

4.5.1通道拆分
1.通过索引拆分
B = [:,:,0]
G = [:,:,1]
R = [:,:,2]
**
例子1:编写程序,演示图像通道拆分及通道值改变对彩色图像的影响
import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)

b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]

cv.imshow(“b”,b)
cv.imshow(“g”,g)
cv.imshow(“r”,r)

img[:,:,0] = 0
cv.imshow(“imgb0”,img)

img[:,:,1] = 0
cv.imshow(“imgg0”,img)

img[:,:,2] = 0
cv.imshow(“imgr0”,img)

cv.waitKey(0)
cv.destroyAllWindows()在这里插入图片描述
2.通过函数拆分
函数cv2.split()能够拆分图像的通道。
b,g,r = cv2.split(img)
等价写法:
b=cv2.split(a)[0]
g=cv2.split(a)[1]
r=cv2.split(a)[2]

例子2:编写程序,使用函数cv2.split()拆分图像通道。
import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)
cv.imshow(“original”,img)

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

cv.imshow(“b”,b)
cv.imshow(“g”,g)
cv.imshow(“r”,r)
cv.waitKey(0)
cv.destroyAllWindows()
在这里插入图片描述
4.5.2通道合并
函数cv2.merge()可以实现图像通道的合并
实现的语句为:
bgr=cv2.merge([b,g,r])
例子1#编写程序,演示使用函数cv2.merge()合并通道。
import cv2 as cv
import numpy as np

img = cv.imread(“color.jpg”)
b,g,r = cv.split(img)

bgr = cv.merge([b,g,r])
rgb = cv.merge([r,g,b])
gbr = cv.merge([g,b,r])

cv.imshow(“bgr”,bgr)
cv.imshow(“rgb”,rgb)
cv.imshow(“gbr”,gbr)

cv.waitKey(0)
cv.destroyAllWindows()

**

4.6获取图像的属性

常用的属性:
● shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断一幅图像是灰度图像(或二值图像)还是彩色图像。
**● size:**返回图像的像素数目。其值为“行×列×通道数”,灰度图像或者二值图像的通道数为1。
**● dtype:**返回图像的数据类型。
**
例子:编写程序,观察图像的常用属性值。

import cv2 as cv
import numpy as np

img = cv.imread("color.jpg",1)

print("图像属性:\n")
print("shape = ",img.shape)
print("size = ",img.size)
print("dtype = ",img.dtype)

在这里插入图片描述
下一篇将学习视频相关的操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值