首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV图像处理(二)

OpenCV图像处理(二)

原创
作者头像
AnieaLanie
发布2021-12-24 14:38:57
4710
发布2021-12-24 14:38:57
举报
文章被收录于专栏:铁子的专栏铁子的专栏

1. 基本图像处理函数

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

#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 导入库并读取图像
import cv2 as cv
import numpy as np
2.2 创建底图

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

img = cv.imread('../Resources/Photos/cats.jpg')
cv.imshow('Cats', img)
2.3 灰度化

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

blank = np.zeros(img.shape, dtype='uint8')
cv.imshow('Blank', blank)
2.4 高斯图像滤波

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

blur = cv.GaussianBlur(gray, (5,5), cv.BORDER_DEFAULT)
cv.imshow('Blur', blur)
2.5 提取边缘

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

canny = cv.Canny(blur, 125, 175)
cv.imshow('Canny Edges', canny)

3. 二值化

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

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

threshold, thresh = cv.threshold(gray, 150, 255, cv.THRESH_BINARY )
cv.imshow('Simple Thresholded', thresh)
3.3 图像二值化反转
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主要是用来控制边缘的类型和粗细的

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 平移
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 旋转
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 缩放,放大
resized = cv.resize(img, (500,500), interpolation=cv.INTER_CUBIC)
cv.imshow('Resized', resized)
4.4 翻转
flip = cv.flip(img, -1)
cv.imshow('Flip', flip)
4.5 裁剪
cropped = img[200:400, 300:400]
cv.imshow('Cropped', cropped)

5. 颜色提取

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

#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. 图像梯度,边缘检测

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

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方向的导数,然后得到拉普拉斯变换的结果

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方向梯度图像。

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

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. 过滤非最大值
canny = cv.Canny(gray, 150, 175)
cv.imshow('Canny', canny)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 提取轮廓
    • 2.1 导入库并读取图像
      • 2.2 创建底图
        • 2.3 灰度化
          • 2.4 高斯图像滤波
            • 2.5 提取边缘
            • 3. 二值化
              • 3.1 先将图片灰度化
                • 3.2 图像二值化
                  • 3.3 图像二值化反转
                    • 3.4 图像二值化(自适应阈值)
                    • 4. 图像旋转,裁剪
                      • 4.1 平移
                        • 4.2 旋转
                          • 4.3 缩放,放大
                            • 4.4 翻转
                              • 4.5 裁剪
                              • 5. 颜色提取
                              • 6. 图像梯度,边缘检测
                                • 6.1 拉普拉斯算子
                                  • 6.2 Sobel算子
                                    • 6.3 Canny算法
                                    相关产品与服务
                                    图像处理
                                    图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
                                    领券
                                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档