OpenCV4-python 学习程序 之 图像处理基础
阅读原文时间:2021年04月20日阅读:1

1 图像的分类

1.二值图像 :
仅包含黑色和白色两种颜色,每个像素点只使用一个bit位即可表示,实际上在OpenCV中最小的数据类型为无符号的8位数,故而实际上二值图像是特殊的灰度图像
2.灰度图像 :
灰度图像仅有黑白两种颜色,故而不够细腻,损失了很多细节,通常计算机会将灰度处理为256个灰度级用数值区间[0,255]来表示。其中,数值[255]表示纯白色,数值[0]表示纯黑色,每个像素点占用一个字节(8位)
3.彩色图像 :
此处只对RGB色彩空间进行说明,在RGB色彩空间中存在R(红色),G(绿色),B(蓝色)三个通道(特别说明一下,在OpenCV中通道顺序为BGR,即第一个通道保存B通道信息),每个色彩通道的值均在[0,255]之间,每一通道均可理解为一个独立的灰度图像,每个像素点占用3字节的空间。实际上可以将rgb理解为空间直角坐标系的xyz三轴,每一种特定的颜色都有对应的在三轴上的坐标

2 像素分析

2.1 程序

(1) . 像素分析1(点)

from cv2 import cv2 
import numpy as np

img = np.zeros((6,6),dtype=np.uint8)
print("img=\n",img)
cv2.imshow("one",img)
print("读取像素点img[3,3]=",img[3,3])
img[3,3] = 255
print("修改后 img = \n",img)
print("读取修改后的像素点img=[3,3]",img[3,3])
cv2.imshow("two",img)
cv2.waitKey()
cv2.destroyAllWindows()

效果 :

所以,一像素肉眼可见的小…hhh

(2) . 像素分析2(线/块)

from cv2 import cv2 as cv 
import numpy as np

img = np.zeros((256,256),dtype=np.uint8)
cv.imshow("first",img)

for i in range(99,100):
    for j in range(80,100):
        img[i,j] = 255

cv.imshow("second",img)
cv.waitKey()
cv.destroyAllWindows()

效果 :

(3) . 使用Numpy生成三维数组并观测三个通道值的变化

import numpy as np 
from cv2 import cv2 as cv 

#----------蓝色-----------
blue = np.zeros((300,300,3),dtype=np.uint8)
blue[:,:,0] = 255
print("blue = \n",blue)
cv.imshow("blue",blue)

#----------绿色-----------
green = np.zeros((300,300,3),dtype=np.uint8)
green[:,:,1] = 255
print("green = \n",green)
cv.imshow("green",green)

#----------红色-----------
red = np.zeros((300,300,3),dtype=np.uint8)
red[:,:,2] = 255
print("red = \n",red)
cv.imshow("red",red)

cv.waitKey()
cv.destroyAllWindows()

效果 :

(4) . BGR三原色

import numpy as np
from cv2 import cv2 as cv

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)
cv.imshow("img",img)

cv.waitKey()
cv.destroyAllWindows()

效果 :

(5) . 访问图像像素点的值(BGR)

from cv2 import cv2 as cv 
import numpy as np

img = cv.imread (r"D:\anaconda\vscode-python\pic\1.jpg")
# 图片随便找的

cv.imshow("first",img)
print("image = \n",img)
print("-------------------------")
# 访问图像第一行第二列像素点的BGR值
print("image[1,2] = ",img[1,2])

cv.waitKey()
cv.destroyAllWindows()

效果 :

(6) . 使用numpy生成二维随机数组(灰度图)并用item()及itemset()对其像素进行访问与修改

import numpy as np 
#from cv2 import cv2 as cv 

img = np.random.randint(10,99,size=[5,5],dtype=np.uint8)
print("img = \n",img)
# item能够更加高效的访问图像像素点,格式: item(行,列) 
print("read img.item(3,2) = ",img.item(3,2))
# itemset()可以修改像素值,格式: itemset(索引值,新值)
img.itemset((3,2),255)
print("img = \n",img)
print("change img.item(3,2) = ",img.item(3,2))

结果 :

(7) . 生成随机数组并输出其图像

import numpy as np
from cv2 import cv2 as cv 

img = np.random.randint(0,256,size=[256,256],dtype=np.uint8)
cv.imshow("hhh",img)
cv.waitKey()
cv.destroyAllWindows()

结果 :

(8) . 随机生成灰度图并对其进行修改(块)

import numpy as np 
from cv2 import cv2 as cv 
img = np.random.randint(0,256,size=[256,256],dtype=np.uint8)

print("read img.item(3,2) = ",img.item(3,2))
img.itemset((3,2),255)
print("change img.item(3,2) = ",img.item(3,2))
cv.imshow("first",img)

#遍历块内像素值并对其进行修改
for i in range(10,100):
    for j in range(80,100):
        img.itemset((i,j),255)

#显示与基础操作
cv.imshow("second",img)
cv.waitKey()
cv.destroyAllWindows() 

结果 :

(9) . 随机生成彩色图并对其进行修改(块)

import numpy as np
from cv2 import cv2 as cv 
#img = cv.imread(r"D:\anaconda\vscode-python\1.jpg")
img  = np.random.randint(10,255,size=[666,666,3],dtype=np.uint8)

#print("img = \n",img)
print("read img[1,2,0] = ",img.item(1,2,0))
print("read img[0,2,1] = ",img.item(0,2,1))
print("read img[1,2,2] = ",img.item(1,2,2))

img.itemset((1,2,0),255)
img.itemset((0,2,1),255)
img.itemset((1,2,2),255)

#print("img = \n",img)
print("change img[1,2,0] = ",img.item(1,2,0))
print("change img[0,2,1] = ",img.item(0,2,1))
print("change img[1,2,2] = ",img.item(1,2,2))
cv.imshow("hhh",img)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(10) . 读取一幅彩色图像并对其像素进行访问修改

import numpy as np 
from cv2 import cv2 as cv
img = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg")
#img  = np.random.randint(10,255,size=[666,666,3],dtype=np.uint8)
cv.imshow("before",img)
print("read img.item(0,0,0) = ",img.item(0,0,0))
print("read img.item(0,0,1) = ",img.item(0,0,1))
print("read img.item(0,0,2) = ",img.item(0,0,2))

for i in range(0,400):
    for j in range(0,600):
        for k in range(0,3):
            img.itemset((i,j,k),255)

cv.imshow("after",img)
print("change img.item(0,0,0) = ",img.item(0,0,0))
print("change img.item(0,0,1) = ",img.item(0,0,1))
print("change img.item(0,0,2) = ",img.item(0,0,2))

cv.waitKey()
cv.destroyAllWindows()

结果 :

2 ROI

2.1 程序

(1) . 获取图像部分信息并对其进行输出

from cv2 import cv2 as cv 

a = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_UNCHANGED)

roi = a[220:400,250:350]
cv.imshow("original",a)
cv.imshow("roi",roi)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(2) . --插曲–cv2.imread()用法(第二个参数)

from cv2 import cv2 as cv

a = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_UNCHANGED)
cv.imshow("ori",a)
b = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_GRAYSCALE)
cv.imshow("gray",b)
c = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_COLOR)
cv.imshow("bgr",c)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(3) . 图像打码(随机像素点)

from cv2 import cv2 as cv
import numpy as np

a = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_UNCHANGED)
cv.imshow("whole",a)

hhh = np.random.randint(0,256,(100,100,3))
a[200:300,400:500]=hhh
cv.imshow("section",a)
cv.waitKey()
cv.destroyAllWindows()

(4) . 将一幅图像的一部分(ROI)放到另外一幅图中

from cv2 import cv2 as cv

a = cv.imread(r"D:\anaconda\vscode-python\pic\1.jpg",cv.IMREAD_UNCHANGED)
b = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg",cv.IMREAD_UNCHANGED)

cv.imshow("aaa",a)
cv.imshow("bbb",b)
sections = b[200:300,400:500]
a[300:400,700:800] = sections
cv.imshow("hhh",a)

cv.waitKey()
cv.destroyAllWindows()

结果 :

3 通道操作

3.1 程序

(1) . 提取通道

from cv2 import cv2 as cv

a = cv.imread(r"D:\anaconda\vscode-python\pic\1.jpg",cv.IMREAD_UNCHANGED)
b = a[200:300,600:700]

b0 = b[:,:,0]
b1 = b[:,:,1]
b2 = b[:,:,2]

print("B = ",b0)
print("G = ",b1)
print("R = ",b2)

cv.imshow("B",b0)
cv.imshow("G",b1)
cv.imshow("R",b2)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(2) . 图像通道拆分(索引值)及通道值更改

from cv2 import cv2 as cv

lena = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg")
cv.imshow("lena",lena)

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

cv.imshow("b",b)
cv.imshow("g",g)
cv.imshow("r",r)

lena[:,:,0] = 0
cv.imshow("lena_b0",lena)
lena[:,:,1] = 0
cv.imshow("lena_b0_g0",lena)

cv.waitKey()
cv.destroyAllWindows() 

结果 :

(3) . 使用函数cv2.split()来拆分图像

from cv2 import cv2 as cv 

lena = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg")
b,g,r = cv.split(lena)
cv.imshow("b",b)
cv.imshow("g",g)
cv.imshow("r",r)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(4) . 利用cv2.merge()合并通道(三通道错位合并)

from cv2 import cv2 as cv 

lena = cv.imread(r"D:\anaconda\vscode-python\pic\timg.jpg")

b,g,r = cv.split(lena)
bgr = cv.merge([b,g,r])
rgb = cv.merge([r,g,b])
gbr = cv.merge([g,b,r])
#cv.imshow("lena",lena)
cv.imshow("bgr",bgr)
cv.imshow("rgb",rgb)
cv.imshow("gbr",gbr)

cv.waitKey()
cv.destroyAllWindows()

结果 :

(5) . 观察图像常用属性值

from cv2 import cv2 as cv

gray = cv.imread(r"D:\anaconda\vscode-python\pic\1.jpg",0)
color = cv.imread(r"D:\anaconda\vscode-python\pic\1.jpg",-1)

print("gray.shape = ",gray.shape)
print("gray.size = ",gray.size)
print("gray.dtype = ",gray.dtype)
print("_________________________________")
print("color.shape = ",color.shape)
print("color.size = ",color.size)
print("color.dtype = ",color.dtype)

# cv.imshow("gray",gray)
# cv.imshow("color",color)
cv.waitKey()
cv.destroyAllWindows()

结果 :

本文参考自 : 李立宗《OpenCV轻松入门 : 面向Python》