OpenCV图像处理(二)

2021-12-24 14:38:57 浏览数 (1)

1. 基本图像处理函数

基本图像处理函数包括读取,灰度,模糊,边缘提取,膨胀,腐蚀,重新整理大小,剪切等

代码语言:javascript复制
#pylint:disable=no-member
# 基本图像处理函数
#读取,灰度,模糊,边缘提取,膨胀,腐蚀,重新整理大小,剪切
import cv2 as cv
​
# 读取图片
img = cv.imread('../Resources/Photos/park.jpg')
cv.imshow('Park', img)
​
# 灰度化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Gray', gray)
​
# 高斯模糊 
blur = cv.GaussianBlur(img, (7,7), cv.BORDER_DEFAULT)
cv.imshow('Blur', blur)
​
# 边缘检测
canny = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges', canny)
​
# 膨胀
dilated = cv.dilate(canny, (7,7), iterations=3)
cv.imshow('Dilated', dilated)
​
# 腐蚀
eroded = cv.erode(dilated, (7,7), iterations=3)
cv.imshow('Eroded', eroded)
​
# 缩放
resized = cv.resize(img, (500,500), interpolation=cv.INTER_CUBIC)
cv.imshow('Resized', resized)
​
# 裁剪
cropped = img[50:200, 200:400]
cv.imshow('Cropped', cropped)
​
cv.waitKey(0)

2. 提取轮廓

2.1 导入库并读取图像
代码语言:javascript复制
import cv2 as cv
import numpy as np
2.2 创建底图

zeros 相当于创建一张黑色的图,每个像素的每个通道都为0,Scalar(0,0,0);

代码语言:javascript复制
img = cv.imread('../Resources/Photos/cats.jpg')
cv.imshow('Cats', img)
2.3 灰度化

一个像素点的颜色通常包括R、G、B三个分量,分别显示出红、绿、蓝三个颜色,灰度化就是使彩色图像的R、G、B三个分量相等的过程

代码语言:javascript复制
blank = np.zeros(img.shape, dtype='uint8')
cv.imshow('Blank', blank)
2.4 高斯图像滤波

高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权和高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程

代码语言:javascript复制
blur = cv.GaussianBlur(gray, (5,5), cv.BORDER_DEFAULT)
cv.imshow('Blur', blur)
2.5 提取边缘

Canny()函数可以使用canny算法对输入图像进行边缘检测

代码语言:javascript复制
canny = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges', canny)

3. 二值化

代码语言:javascript复制
import cv2 as cv
​
#原图
img = cv.imread('../Resources/Photos/cats.jpg')
cv.imshow('Cats', img)
3.1 先将图片灰度化
代码语言:javascript复制
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Gray', gray)
3.2 图像二值化

图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。

代码语言:javascript复制
threshold, thresh = cv.threshold(gray, 150, 255, cv.THRESH_BINARY )
cv.imshow('Simple Thresholded', thresh)
3.3 图像二值化反转
代码语言:javascript复制
threshold, thresh_inv = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV )
cv.imshow('Simple Thresholded Inverse', thresh_inv)
3.4 图像二值化(自适应阈值)

对一幅灰度图像进行二值化,该函数支持就地操作,该函数用下面的公式对一幅灰度图像进行二值化:

(1)正向二值化,THRESH_BINARY

(2)反向二值化,THRESH_BINARY_INV

函数cvAdaptiveThreshold的确可以将灰度图像二值化,但它的主要功能应该是边缘提取,并且参数param1主要是用来控制边缘的类型和粗细的

代码语言:javascript复制
adaptive_thresh = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY_INV, 11, 9)
cv.imshow('Adaptive Thresholding', adaptive_thresh)

4. 图像旋转,裁剪

4.1 平移
代码语言:javascript复制
def translate(img, x, y):
    transMat = np.float32([[1,0,x],[0,1,y]])
    dimensions = (img.shape[1], img.shape[0])
    #仿射变换是二维坐标间的线性变换,故而变换后的图像仍然具有原图的一些性质,
    # 包括“平直性”以及“平行性”,常用于图像翻转(Flip)、旋转(Rotations)、
    # 平移(Translations)、缩放(Scale operations)等,然而其实现的函数就
    # 是cv::warpAffine()
    return cv.warpAffine(img, transMat, dimensions)
​
translated = translate(img, -100, 100)
cv.imshow('Translated', translated)
4.2 旋转
代码语言:javascript复制
def rotate(img, angle, rotPoint=None):
    (height,width) = img.shape[:2]
​
    if rotPoint is None:
        rotPoint = (width//2,height//2)
    
    rotMat = cv.getRotationMatrix2D(rotPoint, angle, 1.0)
    dimensions = (width,height)
​
    return cv.warpAffine(img, rotMat, dimensions)
​
rotated = rotate(img, -45)
cv.imshow('Rotated', rotated)
4.3 缩放,放大
代码语言:javascript复制
resized = cv.resize(img, (500,500), interpolation=cv.INTER_CUBIC)
cv.imshow('Resized', resized)
4.4 翻转
代码语言:javascript复制
flip = cv.flip(img, -1)
cv.imshow('Flip', flip)
4.5 裁剪
代码语言:javascript复制
cropped = img[200:400, 300:400]
cv.imshow('Cropped', cropped)

5. 颜色提取

分割为r,g,b三种颜色图片,并合并

代码语言:javascript复制
#pylint:disable=no-member
#颜色空间分隔,合并
#分割为r,g,b三种颜色图片,并合并
import cv2 as cv
import numpy as np
​
img = cv.imread('../Resources/Photos/park.jpg')
cv.imshow('Park', img)
​
blank = np.zeros(img.shape[:2], dtype='uint8')
​
b,g,r = cv.split(img)
​
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)
​
print(img.shape)
print(b.shape)
print(g.shape)
print(r.shape)
​
merged = cv.merge([b,g,r])
cv.imshow('Merged Image', merged)
​
cv.waitKey(0)

6. 图像梯度,边缘检测

导入库并读取图片,转换为灰度图

代码语言:javascript复制
import cv2 as cv
import numpy as np
​
img = cv.imread('../Resources/Photos/park.jpg')
cv.imshow('Park', img)
​
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow('Gray', gray)
6.1 拉普拉斯算子

Laplacian()函数其实主要利用sobel算子进行运算,通过sobel算子得到图像x方向和y方向的导数,然后得到拉普拉斯变换的结果

代码语言:javascript复制
lap = cv.Laplacian(gray, cv.CV_64F)
lap = np.uint8(np.absolute(lap))
cv.imshow('Laplacian', lap)
6.2 Sobel算子

Sobel算子:是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度,梯度越大越有可能是边缘。

Soble算子的功能集合了高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到的是图像在X方法与Y方向梯度图像。

缺点:比较敏感,容易受影响,要通过高斯模糊(平滑)来降噪。

代码语言:javascript复制
sobelx = cv.Sobel(gray, cv.CV_64F, 1, 0)
sobely = cv.Sobel(gray, cv.CV_64F, 0, 1)
#图像结合
combined_sobel = cv.bitwise_or(sobelx, sobely)
​
cv.imshow('Sobel X', sobelx)
cv.imshow('Sobel Y', sobely)
cv.imshow('Combined Sobel', combined_sobel)
6.3 Canny算法

Canny算法是一个多级边缘检测算法

Canny算法的步骤:

1.消除噪声

2.寻找图像中的亮度梯度 ( 计算梯度值和梯度方向)

  1. 过滤非最大值
代码语言:javascript复制
canny = cv.Canny(gray, 150, 175)
cv.imshow('Canny', canny)

0 人点赞