色彩空间 Color Space
OpenCV的imread()的默认格式取BGR,可以转化显示其他格式下的图像。
import cv2 as cv
img = cv.imread('Photos/park.jpg') #imread的默认格式为BGR
cv.imshow('Park',img)
#BGR to Grayscale
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('Gray',gray)
#BGR to HSV(色相饱和度)
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
cv.imshow('HSV',hsv)
#BRG to LAB
lab = cv.cvtColor(img,cv.COLOR_BGR2LAB)
cv.imshow('LAB',lab)
cv.waitKey(0)
一般来说,支持BGR to Grayscale/HSV/LAB的同时,也支持Grayscale/HSV/LAB to bgr,但想要做到比如HSV to LAB这样的转换,就不能一步到位,需要HSV to BGR --> BGR to LAB才行。
#HSV to BGR
hsv_bgr = cv.cvtColor(hsv,cv.COLOR_HSV2BGR)
cv.imshow('HSV --> BGR',hsv_bgr)
对比看看通过matplotlib显示的图像。
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('Photos/park.jpg') #imread的默认格式为BGR
cv.imshow('Park',img)
plt.imshow(img)
plt.show()
#matplotlib并不知道所给图像是BGR图像,通过RGB方式进行显示
可以通过cv.COLOR_BGR2RGB来使得matplotlib显示正确的图像。
#BRG to RGB
rgb = cv.cvtColor(img,cv.COLOR_BGR2RGB)
cv.imshow('RGB',rgb)
plt.imshow(rgb)
plt.show()
色彩通道 Color Channels
分割(Split)色彩通道。将图像分为三个颜色通道。
import cv2 as cv
import numpy as np
img = cv.imread('Photos/park.jpg')
cv.imshow('Park',img)
b,g,r = cv.split(img) #将图像分为三个颜色通道
cv.imshow('Blue',b)
cv.imshow('Green',g)
cv.imshow('Red',r)
print(img.shape)
print(b.shape)
print(g.shape)
print(r.shape)
cv.waitKey(0)
(427, 640, 3)
(427, 640)
(427, 640)
(427, 640)
图像某个区域越暗表示该区域属于该颜色的像素越少。可以看到Blue中天空接近白色,而树则接近黑色,Green中颜色分布就相对均匀。从输出的各通道shape也能看出最后显示的图像都是灰度图。
合并(Merge)通道。
merged = cv.merge([b,g,r])
cv.imshow('Merged Image',merged)
显示各自颜色通道中的颜色。
blank = np.zeros(img.shape[0:2],dtype='uint8')
blue = cv.merge([b,blank,blank])#给绿色和红色部分设为全0,只显示蓝色部分
green = cv.merge([blank,g,blank])
red = cv.merge([blank,blank,r])
cv.imshow('Blue',blue)
cv.imshow('Green',green)
cv.imshow('Red',red)
模糊 Blurring Techniques
处理由照相机传感器或照明等问题造成的噪点。接下来试试四种模糊处理方式。
import cv2 as cv
img = cv.imread('Photos/cats.jpg')
cv.imshow('Cats',img)
#Averaging 内核中心的像素值为其周围像素的平均值
average = cv.blur(img,(7,7)) #内核为奇数且越大模糊效果越明显
cv.imshow('Average Blur',average)
#内核可以理解为一个窗口,在这个窗口中作相应的处理
#Gaussian Blur 高斯模糊(滤波) 会给周围像素设置特定的权重
#与Averaging相比会产生更少的模糊,更自然
gauss = cv.GaussianBlur(img,(7,7),sigmaX=0) #sgimaX为高斯核在x方向的标准差
cv.imshow('Gaussian Blur',gauss)
#Median Blur 中值滤波 内核中心的像素值取周围像素的中位数
median = cv.medianBlur(img,7) #此处内核只需给出一个整数,opencv会自动假定内核为7乘7
#中值滤波一般适用于小内核
cv.imshow('Median Blur',median)
#Bilateral Blur 双边滤波 可以保持边缘
bilateral = cv.bilateralFilter(img,d=10,sigmaColor=35,sigmaSpace=25)
#d为像素领域的直径,并不是内核大小
#sigmaColor越大表示计算模糊时会有更多颜色需要考虑
#sigmaSpace越大表示相距越远的元素也会影响模糊计算
cv.imshow('Bilateral',bilateral)
cv.waitKey(0)
可以看出中值滤波的内核为7时效果模糊效果就很明显了。当Averaging和高斯滤波内核大小相同时,高斯滤波产生的模糊更少。
位运算 Bitwise Operations
画一个矩形和一个圆,对这两个图像进行位运算。
#按位运算符
import cv2 as cv
import numpy as np
blank = np.zeros((400,400),dtype='uint8')
rectangle = cv.rectangle(blank.copy(),(30,30),(370,370),255,-1)
circle = cv.circle(blank.copy(),(200,200),200,255,-1)
cv.imshow('Rectangle',rectangle)
cv.imshow('Circle',circle)
#画一个矩形和圆来观察运算符效果
#bitwise AND 与运算
bitwise_and = cv.bitwise_and(rectangle,circle)
cv.imshow('Bitwise AND',bitwise_and)
#返回两个图像的公共区域(相交区域)
#bitwise OR 或运算
bitwise_or = cv.bitwise_or(rectangle,circle)
cv.imshow('Bitwise OR',bitwise_or)
#返回两个图像合并后的区域(相交区域+不相交区域)
#bitwise XOR 异或运算
bitwise_xor = cv.bitwise_xor(rectangle,circle)
cv.imshow('Bitwise,XOR',bitwise_xor)
#返回两个图像不相交的区域
#bitwise NOT
bitwise_not = cv.bitwise_not(rectangle,circle)
cv.imshow('Bitwise NOT',bitwise_not)
#黑色区域变白,白色区域变黑
cv.waitKey(0)