随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。
数字图像,又称 数码图像或 数位图像,是二维图像用有限数字数值像素的表示。由数组或矩阵表示,其光照位置和强度都是离散的。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储和处理的图像。
像素(或像元,Pixel)是数字图像的基本元素。
像素是在模拟图像数字化时对连续空间进行离散化得到的。每个像素具有整数行(高)和列(宽)位置坐标,同时每个像素都具有整数灰度值或颜色值。
数字图像处理
其实就是处理二维矩阵数据。利用opencv来学习处理算法是一种比较好的方式。
本篇文章的目标:
- 能够认识OpenCV的作用
- 能够实现图像读取、显示、保存
- 能够使用函数实现图像信息获取
- 能够使用for循环访问与修改图像像素
- 能够利用索引与函数进行通道操作
1.
读取图像cv2.imread(filename, flags)
flags的值:
cv2.IMREAD_UNCHANGED -1 #原图
cv2.IMREAD_GRAYSCALE 0 #灰度图
cv2.IMREAD_COLOR 1 #BGR图像,默认
cv2.IMREAD_ANYDEPTH 2 #对应深度图像
cv2.ANYCOLOR 4 #以任何可能的格式读图
#图像读取
import cv2
img=cv2.imread('kdx.jpg')
img
array([[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[254, 214, 132],
[254, 214, 132],
[254, 214, 132]],
[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[254, 214, 132],
[254, 214, 132],
[254, 214, 132]],
[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[254, 214, 132],
[254, 214, 132],
[254, 214, 132]],
...,
[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[253, 214, 135],
[253, 214, 135],
[253, 214, 135]],
[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[253, 214, 135],
[253, 214, 135],
[253, 214, 135]],
[[254, 214, 132],
[254, 214, 132],
[254, 214, 132],
...,
[253, 214, 135],
[253, 214, 135],
[253, 214, 135]]], dtype=uint8)
2.
显示图像cv2.imshow(winname, mat) #显示函数
cv2.waitkey(delay) #等待按键函数
destroyWindow(winname)#销毁窗口函数
destroyAllWindows()#销毁所有窗口函数
cv2.namedWindow('kdx',cv2.WARP_FILL_OUTLIERS)
cv2.imshow('kdx',img)
cv2.waitKey()
cv2.destroyAllWindows()
#如果想方便点的话可以简单自定义一个函数专门用于显示
def cv_show(name,img):
cv2.namedWindow(name,cv2.WARP_FILL_OUTLIERS)
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv_show('kdx',img)
3.
保存图像cv2.imwrite(filename, img)
#图像保存
cv2.imwrite('littlekdx.jpg',img)
True
练习:以灰度图
形式读取lenacolor.png,并保存为lenagray.png
#方法一 cv2.IMREAD_GRAYSCALE
img1=cv2.imread('kdx.jpg',cv2.IMREAD_GRAYSCALE)
#方法二 0
img1=cv2.imread('kdx.jpg',0)
cv2.imwrite('kdxgray.png',img1)
True
print("图像的形状:",img.shape)#img.shape返回值为元组(行、列和通道)
图像的形状: (1024, 768, 3)
print("图像的数据类型:",img.dtype)
图像的数据类型: uint8
print("图像的像素总数:",img.size)
图像的像素总数: 2359296
1.二值图像(仅包含黑色和白色) 因图像比较简单,只有两种颜色,所以一个bit位0/1就可以表示
2.灰度图像
二值图像表示起来方便,但是由于只有两种颜色,所表示的图像不够细腻,而灰度图像采用更多数值来体现不同的颜色。
通常,计算机把灰度处理为256个灰度级,[0, 255],其中,0表示纯黑,255表示纯白正好用一个字节就可以表示(8位)
3.彩色图像
仅介绍常见的RGB色彩空间,其中存在R(red), G(Green), B(Blue)三个通道。每个值都在[0, 255]以内,用这三个色彩通道的组合表示颜色,故需要三个字节来表示。
4.Numpy库
numpy库中zeros()和ones()函数均可以生成一个数组
使用 random.randint函数随机生成256*256的彩色图像
import numpy as np
imgrad=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
cv2.imshow("demo",imgrad)
cv2.waitKey()
cv2.destroyAllWindows()
For循环进行像素访问与修改
img2=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
for i in range(0,50):
for j in range(0,100):
for k in range(0,3):
img2[i,j,k]=255
cv2.imshow("before",imgrad)
cv2.imshow('after',img2)
cv2.waitKey()
cv2.destroyAllWindows()
使用item()访问像素点
使用itemset()修改像素点
import numpy as np
img=np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print("img=\n",img)
print("读取像素点img[3,2]=",img.item(3,2))
img.itemset((3,2),255)
print("修改后img=\n",img)
print("修改后像素点img[3,2]=",img.item(3,2))
img=
[[13 22 29 95 93]
[70 87 44 64 14]
[16 76 15 57 55]
[97 29 84 96 41]
[45 22 14 94 65]]
读取像素点img[3,2]= 84
修改后img=
[[ 13 22 29 95 93]
[ 70 87 44 64 14]
[ 16 76 15 57 55]
[ 97 29 255 96 41]
[ 45 22 14 94 65]]
修改后像素点img[3,2]= 255
img=cv2.imread("kdx.jpg")
cv2.imshow("before",img)
for i in range(0,200):
for j in range(0,200):
for k in range(0,3):
img.itemset((i,j,k),255) #白色
cv_show("after",img)
cv2.waitKey()
cv2.destroyAllWindows()
6.感兴趣区域ROI
Img[400:550,200:360]
#感兴趣区域ROI
img=cv2.imread('kdx.jpg')
kdx=img[400:550,200:360]
cv2.imshow('kdx_roi',kdx)
cv2.waitKey()
cv2.destroyAllWindows()
通道操作:
通过索引拆分
B = img[: ,:, 0]
G = img[:, :, 1]
R = img[:, :, 2]
通过函数拆分
B, G, R = cv2.split(img)
通道合并:
Img = cv2.merge([B , G ,R])
1.通道拆分
①通过索引拆分
#通道拆分-通过索引拆分
import cv2
kdx=cv2.imread('kdx.jpg')
cv2.imshow('kdx',kdx)
b=dog[:,:,0]
g=dog[:,:,1]
r=dog[:,:,2]
cv2.imshow("b",b)
cv2.imwrite("kdx_b.jpg",b)
cv2.imshow("g",g)
cv2.imwrite("kdx_g.jpg",g)
cv2.imshow("r",r)
cv2.imwrite("kdx_r.jpg",r)
cv2.waitKey()
cv2.destroyAllWindows()
②通过函数拆分 split()
import cv2
#通道拆分-通过函数拆分
kdx=cv2.imread('kdx.jpg')
b,g,r=cv2.split(kdx)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destroyAllWindows()
2.通道拆分合并
bgr=cv2.merge([b,g,r])
rgb=cv2.merge([r,g,b])
cv2.imshow("kdx",kdx)
cv2.imshow("bgr",bgr)
cv2.imwrite("kdx_bgr.jpg",bgr)
cv2.imshow("rgb",rgb)
cv2.imwrite("kdx_rgb.jpg",rgb)
cv2.waitKey()
cv2.destroyAllWindows()
本次主要介绍了图像的基本表示方法、像素的访问和操作、感兴趣区域处理、通道处理等知识点。需要强调的是,使用面向Python的OpenCV必须熟练掌握Numpy库,尤其是Numpy.array库,Numpy.array库是Python图像处理的基础。
以上就是今天要讲的内容,本文仅仅简单介绍了OpenCV利用数字图像处理基础改变所需图像颜色,而数字图像处理提供了大量能使我们快速便捷地处理数据的函数和方法。