OPEN CV系列二:图像处理

Posted yuganwj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OPEN CV系列二:图像处理相关的知识,希望对你有一定的参考价值。

### 图像梯度 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系列二:图像处理的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV基本功 之 图像的掩模运算 & 合并专题 -小啾带学Python-Open_CV系列

OpenCV像素处理基本操作 Open_CV系列

小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理Python-Open_CV系列

[OPEN CV] 常用视频操作方法

计算机视觉实战基础Open-CV的使用

使用 Pykinect 和 Open CV 保存 Kinect RGB 和深度图像