码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-11-02 10:21:19      阅读:21      评论:0      收藏: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!