OPEN CV系列二:图像处理(二)

技术文章 11个月前 完美者
1,916 0

标签:gray   mod   rectangle   eth   imp   oat   放大   length   偶数   

### 图像梯度 laplacian算子

img = cv2.imread(‘0.jpg‘,cv2.IMREAD_GRAYSCALE )

sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)  # x方向

sobelx = cv2.convertScaleAbs(sobelx)

sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)  # y方向

sobely = cv2.convertScaleAbs(sobely)

sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0)  # x方向

sobelx = cv2.convertScaleAbs(sobelx)

scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1)  # y方向

sobely = cv2.convertScaleAbs(sobely)

scharrxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
laplacian = cv2.Laplacian(img, cv2.CV_64F)

laplacian = cv2.convertScaleAbs(laplacian)
res = np.hstack((img, sobelxy, scharrxy, laplacian))

cv_show(res, ‘res‘)
 
### Canny边缘检测

- 1.使用高斯滤波器,以平滑图像,滤除噪声

- 2.计算图像每个像素点的梯度强度和方向

- 3.应用非极大值抑制,以消除边缘检测带来的杂散效应

- 4.应用双阈值检测来确定真实和潜在的边缘

- 5.通过抑制孤立的弱边缘最终完成边缘检测
import cv2

import numpy as np

img = cv2.imread(‘0.jpg‘, cv2.IMREAD_GRAYSCALE)

v1 = cv2.Canny(img, 80, 150)  # 双阈值

v2 = cv2.Canny(img, 50, 100)

res = np.hstack((v1, v2))

def cv_show(img, name):

    cv2.imshow(name, img)

    cv2.waitKey()

    cv2.destroyAllWindows()

cv_show( res, ‘res‘)
img = cv2.imread(‘1.jpg‘, cv2.IMREAD_GRAYSCALE)

v1 = cv2.Canny(img, 80, 150)

v2 = cv2.Canny(img, 50, 100)

res = np.hstack((v1, v2))
cv_show( res, ‘res‘)
 
### 高斯金字塔

- 高斯金字塔下采样:将图像与高斯内核卷积,将所有的偶数行和列去除

- 高斯金字塔上采样:1.将图像在每个方向扩大为原来的俩倍,新增的行和列以0填充

-             2.使用先前同样的内核(乘以4)与放大后的图像卷积,获得近似值
img = cv2.imread(‘0.jpg‘)

cv_show(img, ‘img‘)

print(img.shape)
up = cv2.pyrUp(img)

cv_show(up, ‘up‘)  # 上采样 2倍

print(up.shape)
down = cv2.pyrDown(img)

cv_show(down, ‘down‘)  # 下采样 2倍

print(down.shape)
 
### 拉普拉斯金字塔

- 图像=原始图像-(pyrUp(pyrDown(原始图像)))
down = cv2.pyrDown(img)

down_up = cv2.pyrUp(down)

l = img - down_up

cv_show(l, ‘l‘)
 
### 图像轮廓  (轮廓不同于边缘,连接在一起的才叫轮廓)

#### cv2.findContours(img, mode, method)

#### mode: 轮廓检索模式

- RETR_EXTERNAL: 只检索最外面的轮廓

- RETR_LIST: 检索所有的轮廓,并将其保存在一条链表当中

- RETR_CCOMP: 检索所有的轮廓,并将他们组织为俩层:顶层是各部分的外部边界,第二层是空洞的边界

- RETR_TREE: 检索所有的轮廓,并重构嵌套轮廓的整个层次
#### method:轮廓逼近方法

- CHAIN_APPROX_NONE: 以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)

- CHAIN_APPROX_SIMPLE: 压缩水平的、垂直的和斜的部分,也就是:函数只保留他们的终点部分
### 为了更高的准确率,使用二值图像
import cv2

img = cv2.imread(‘1.jpg‘)  # 读数据

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换灰度图

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 图像阈值 二值处理(0, 255)

def cv_show(img, name):

    cv2.imshow(name, img)

    cv2.waitKey()

    cv2.destroyAllWindows()

cv_show(thresh, ‘thresh‘)
binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 检测函数
### 绘制轮廓
# 传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度

# 注意传入的模型需要copy,因为函数实在原图像上进行轮廓绘制的

cv_show(img, ‘img‘)

draw_img = img.copy()

res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)  # (图片, 轮廓信息, 画第几个轮廓,(B,G,R), 线条宽度)

cv_show(res, ‘res‘)
### 轮廓特征
len(contours)  # 轮廓个数
cnt = contours[10]

cv2.contourArea(cnt)  # 轮廓面积
cv2.arcLength(cnt, True)  # 轮廓周长, True表示闭合
 
### 轮廓近似
import cv2

def cv_show(img, name):

    cv2.imshow(name, img)

    cv2.waitKey()

    cv2.destroyAllWindows()

img = cv2.imread(‘3.jpg‘)  # 读数据

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换灰度图

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 图像阈值 二值处理(0, 255)

binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 检测函数

print(len(contours))

cnt = contours[66]

draw_img = img.copy()

res = cv2.drawContours(draw_img, [cnt], -1, (0, 0, 255), 2)  # (图片, 轮廓信息, 画第几个轮廓,(B,G,R), 线条宽度)

cv_show(res, ‘res‘)
epsilon = 0.05 * cv2.arcLength(cnt, True)

approx = cv2.approxPolyDP(cnt, epsilon, True)
draw_img = img.copy()

res = cv2.drawContours(draw_img, [approx], -1, (0, 0, 255), 2)

cv_show(res, ‘res‘)
 
 
### 外接矩形

img = cv2.imread(‘3.jpg‘)  # 读数据

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换灰度图

ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  # 图像阈值 二值处理(0, 255)

binary, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)  # 检测函数

print(len(contours))

cnt = contours[66]
x, y, w, h = cv2.boundingRect(cnt)

img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv_show(img, ‘img‘)
area = cv2.contourArea(cnt)

x, y, w, h = cv2.boundingRect(cnt)

rect_area = w * h

extend = float(area) / rect_area

print(‘轮廓面积与边界矩形面积之比为:‘, extend)
 
### 外接圆
(x, y), radius = cv2.minEnclosingCircle(cnt)

center = (int(x), int(y))

radius = int(radius)

img = cv2.circle(img, center, radius, (0, 255, 0), 2)

cv_show(img, ‘img‘)
 

 

OPEN CV系列二:图像处理(二)

标签:gray   mod   rectangle   eth   imp   oat   放大   length   偶数   

原文地址:https://www.cnblogs.com/yuganwj/p/13837016.html

版权声明:完美者 发表于 2020-11-02 10:21:19。
转载请注明:OPEN CV系列二:图像处理(二) | 完美导航

暂无评论

暂无评论...