OpenCV 高级部分(上) 色彩空间+色彩通道+模糊+位运算

色彩空间 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)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值