美文网首页
python视觉快速入门(OpenCV)8 色彩空间9颜色通道1

python视觉快速入门(OpenCV)8 色彩空间9颜色通道1

作者: python测试开发 | 来源:发表于2022-11-27 08:03 被阅读0次

色彩空间

BGR到灰度

参见第四章:

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

BGR到HSV

HSV是色调饱和度值(Hue Saturation Value)的简称。它是基于人类对色彩的思考和感知方式。

hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

正如你所看到的,图像中有大量的绿色,而天空是偏红的。现在我们还有另一种颜色空间。这就是所谓的LAB颜色空间。

BGR到LAB

这种颜色空间有时被表示为L乘以A乘以B(L times A times B)。

lab = cv.cvtColor(img, cv.COLOR_BGR2LAB)

你已经看到了我们的BGR图像的LAB版本。它看起来像是BGR图像的水洗版本。这就是LAB格式。它更适应人类对颜色的感知。

BGR到RGB

转换到RGB和转换到我们讨论过的其他颜色空间一样简单。请按照以下代码操作。

rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)

我们基本上已经把BGR转换成灰度,BGR,HSV BGR转换成RGB,BGR转换成RGB。我们可以做这个的逆运算。我们可以把灰度图像转换成BGR,把HSV转换成BGR,把LAB转换成BGR,把RGB转换成BGR,等等。

但这里有一个弊端。你不能直接将灰度图像转换为HSV。如果你想这么做,你必须把灰度转换为BGR。然后再从BGR转为HSV。

HSV转BGR

这在代码上与其他所有的转换几乎相似,因为我们想在本质上使用相同的cv.cvtColor()函数。然而,在这种情况下,我们将改变src图像,而传递HSV。请看下面的代码。

hsv_bgr = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)

例如,如果你想从灰度转换为LAB,注意没有直接的方法。你可以做的是将灰度转换为BGR。然后再从BGR到,也许这也是可以的。通过直接。我不认为有什么方法可以做到这一点。如果OpenCV能想出一个可以实现的功能,那就好了,但这并不妨碍你多写几行代码,至少要多写两三行代码,难度适中。

颜色通道

本章中我们将讨论如何在OpenCV中分割和合并颜色通道。

分割通道

cv.split()函数用于分割通道。

import cv2 as cv
import numpy as np

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Nature', img)

blank = np.zeros (img.shape[:2], dtype='uint8')
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)
blue = cv.merge([b,blank,blank])
green = cv.merge([blank,g,blank])
red = cv.merge([blank,blank,r])
cv.imshow('Blue', blue)
cv.imshow('Green', green)
cv.imshow('Red', red)

merge = cv.merge ([b,g,r])
cv.imshow('Merged Image', merge)
cv.waitKey(0)

合并通道

cv.merge()用于合并通道。

显示彩色通道

单色混合空白图像,可以显示彩色通道。

import cv2 as cv
import numpy as np

img = cv.imread ('images/colours.jpg')

cv.imshow('Nature', img)

模糊

本章将讨论OpenCV中的平滑和模糊的概念。

当图像有很多噪声时,我们通常会对其进行平滑处理,而由相机传感器引起的噪声基本上是拍摄图像时的照明问题。而我们基本上可以通过应用一些模糊的方法来平滑图像或减少一些噪声。

之前,我们讨论了高斯模糊法,这是最流行的模糊方法之一。

OpenCV中模糊的概念

  • Kernel

内核的东西,有时也叫做窗口。它本质上是窗口或一系列行和列的像素。内核大小是你想要处理的范围内的行数和列数。

  • Averaging

图像的平均化是通过在图像上使用卷积操作和归一化盒式滤波器来实现的。在卷积操作中,滤波器或内核在图像上移动,并找到内核下所有像素的平均值。然后,这个平均值被用来替换图像的中心元素。

注意:内核的大小会影响到图像的平滑程度。如果内核的大小太大,图像的小部分就会被拿掉。但如果内核的大小太小,就无法摆脱噪音。

因此,从本质上讲,平均化是通过在图像的特定部分定义一个内核窗口来完成的。这个窗口基本上会计算出中间像素的像素强度,也就是真正的中心,作为周围像素强度的平均值。

而我们基本上使用这个结果作为中间值或实际中心的像素强度。这个过程发生在整个图像中。

import cv2 as cv

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Cats', img)
average = cv.blur(img, (3,3))
cv.imshow('Averaging', average)
cv.waitKey(0)

内核尺寸越大,图像中的模糊度就越大。

高斯模糊法

高与平均法相同,只不过不是计算所有这些运行的像素强度的平均值,而是给每个运行的像素一个特定的权重。从本质上讲,这些权重的乘积的平均值给了你真实中心的值。

使用这种方法,你往往会得到比平均法更少的模糊。但与平均法相比,高斯模糊法更自然。

import cv2 as cv

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Cats', img)
gauss = cv.GaussianBlur(img, (7,7), 0)
cv.imshow ("Gaussian Blur", gauss)
cv.waitKey(0)

Median Blur

中位模糊和平均法是一样的,只是它不是找到周围像素的平均值,而是找到周围像素的中位数。

一般来说,中度模糊在减少图像中的噪音方面往往比平均法甚至高斯模糊法更有效。而且,它在去除图像中可能存在的一些盐和胡椒的噪声方面也相当不错。

一般来说,人们倾向于在高级计算机视觉项目中使用这种图像模糊方法,这些项目往往依赖于减少大量的噪声。请看运行中值模糊的代码。

import cv2 as cv

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Cats', img)
median = cv.medianBlur(img, 7)
cv.imshow ('Median Blur', median)
cv.waitKey(0)

一般来说,中度模糊的内核尺寸,比如7个甚至5个,在减少图像中的一些噪音方面更有效。例如,你需要使用3这样的小整数而不是7来获得中度模糊的最佳效果。

Bilateral Blurring

双边模糊法是最有效的。传统的模糊方法使图像变得模糊,而不看你是否在减少图像的边缘。双边模糊法应用了模糊,但保留了图像中的边缘。

import cv2 as cv

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Cats', img)
bilateral = cv.bilateralFilter(img, 5, 15, 15)
cv.imshow("Bilateral Blur", bilateral)
cv.waitKey(0)

cv.bilateralFilter()函数传入像素邻域的直径。颜色sigma的值越大,意味着在计算模糊的时候,"附近 "有更多的颜色会被考虑。所以我们将其设置为15。

而sigma空间是你的空间sigma。这个空间sigma的值越大,意味着离中心像素更远的像素将影响模糊计算。所以我们也将其设置为15。

双边滤波中的西格玛空间取的是中心像素或真正中心计算的值。通过给西格玛空间一个较大的值,你表明你是否希望来自图像的极端两端或离直径锚点稍远的像素影响这个计算。

位操作

创建矩形和圆形

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)
cv.imshow("Bitwise NOT", bitwise_not)

cv.waitKey(0)

位与 Bitwise AND

位或

位异或 XOR

位反 Bitwise NOT

MASK遮蔽

import cv2 as cv
import numpy as np

img = cv.imread('Pictures/tiger.jpg', cv.IMREAD_UNCHANGED)
cv.imshow('Cats', img)
blank = np.zeros(img.shape[:2], dtype='uint8')
mask = cv.circle(blank, (img.shape[1]//2,img.shape[0]//2), 300, 255, -1)
cv.imshow('Mask', mask)
 
masked = cv.bitwise_and(img,img,mask=mask)
cv.imshow('Masked Image', masked)

cv.waitKey(0)

我们将用数组中的前2个值来表示大小图像点状的np.zeros。现在,这一点极其重要。遮罩的尺寸必须与图像的尺寸相同。

相关文章

网友评论

      本文标题:python视觉快速入门(OpenCV)8 色彩空间9颜色通道1

      本文链接:https://www.haomeiwen.com/subject/gjuffdtx.html