Python-OpenCV入门(2)-图像处理基础

01

随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。

数字图像,又称 数码图像或 数位图像,是二维图像用有限数字数值像素的表示。由数组或矩阵表示,其光照位置和强度都是离散的。数字图像是由模拟图像数字化得到的、以像素为基本元素的、可以用数字计算机或数字电路存储和处理的图像。

像素(或像元,Pixel)是数字图像的基本元素。
像素是在模拟图像数字化时对连续空间进行离散化得到的。每个像素具有整数行(高)和列(宽)位置坐标,同时每个像素都具有整数灰度值或颜色值。

数字图像处理其实就是处理二维矩阵数据。利用opencv来学习处理算法是一种比较好的方式。

本篇文章的目标:

  1. 能够认识OpenCV的作用
  2. 能够实现图像读取、显示、保存
  3. 能够使用函数实现图像信息获取
  4. 能够使用for循环访问与修改图像像素
  5. 能够利用索引与函数进行通道操作

line

01
图像读取、显示、保存

Python-OpenCV入门(2)-图像处理基础_第1张图片

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()

Python-OpenCV入门(2)-图像处理基础_第2张图片

#如果想方便点的话可以简单自定义一个函数专门用于显示
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

Python-OpenCV入门(2)-图像处理基础_第3张图片

练习:以灰度图形式读取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

Python-OpenCV入门(2)-图像处理基础_第4张图片

02
图像信息获取

print("图像的形状:",img.shape)#img.shape返回值为元组(行、列和通道)
图像的形状: (1024, 768, 3)
print("图像的数据类型:",img.dtype)
图像的数据类型: uint8
print("图像的像素总数:",img.size)
图像的像素总数: 2359296

03
图像像素处理

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()

Python-OpenCV入门(2)-图像处理基础_第5张图片

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()

Python-OpenCV入门(2)-图像处理基础_第6张图片

使用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()

Python-OpenCV入门(2)-图像处理基础_第7张图片

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()

Python-OpenCV入门(2)-图像处理基础_第8张图片

04
通道操作

通道操作:

通过索引拆分
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()

Python-OpenCV入门(2)-图像处理基础_第9张图片
Python-OpenCV入门(2)-图像处理基础_第10张图片
Python-OpenCV入门(2)-图像处理基础_第11张图片

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入门(2)-图像处理基础_第12张图片
Python-OpenCV入门(2)-图像处理基础_第13张图片

05
总结

本次主要介绍了图像的基本表示方法、像素的访问和操作、感兴趣区域处理、通道处理等知识点。需要强调的是,使用面向Python的OpenCV必须熟练掌握Numpy库,尤其是Numpy.array库,Numpy.array库是Python图像处理的基础。

以上就是今天要讲的内容,本文仅仅简单介绍了OpenCV利用数字图像处理基础改变所需图像颜色,而数字图像处理提供了大量能使我们快速便捷地处理数据的函数和方法。

line
Python-OpenCV入门(2)-图像处理基础_第14张图片

点个关注不迷路
觉得孔哥写的对你有帮助?请分享给更多的人
欢迎一起学习!博客平台同步发布,请搜索——和孔哥一起学

Python-OpenCV入门(2)-图像处理基础_第15张图片

版权声明:
作者: 和孔哥一起学
导师:Fu Xianjun
本文版权归作者导师共有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。

你可能感兴趣的:(python,opencv,笔记,python,opencv)