OpenCV 算法解析(一)

news/2024/11/2 1:34:45/

OpenCV 算法解析

  • 1 图像增强
    • 1.1 含义
    • 1.2 方法
      • 1.2.1 直方图均衡
      • 1.2.2 gamma变换
  • 2 除噪
    • 2.1 含义
    • 2.2 方法
      • 2.2.1 高斯滤波
      • 2.2.2 均值滤波
      • 2.2.3 中值滤波
  • 3 边缘检测
    • 3.1 canny
  • 4 HOG特征提取
    • 4.1 含义
    • 4.2 流程
    • 4.3 案例
  • 6 两个比赛
    • 6.1 三个功能整合
    • 6.2 目标检测
    • 6.3 yolov5代码详解

1 图像增强

1.1 含义

突出图像细节,让图像更加清晰。

1.2 方法

直方图均衡

1.2.1 直方图均衡

直方图均衡

import cv2
import numpy as np
import matplotlib.pyplot as pltdef histequal(img_gray):# 1 计算各个像素的频数、累积频数、归一化h,w = img_gray.shapecum_freq = np.array([(img_gray==i).sum() for i in range(255)]).cumsum()cum_freq = (cum_freq/cum_freq[-1]*255).astype(np.uint8)tmp = img_gray.copy()for i in range(255):tmp[img_gray == i] = cum_freq[i]return tmpimg = cv2.imread('opencv/features/cat0.jpg', 0)
out = histequal(img)
plt.subplot(121)
plt.title('org')
plt.imshow( img,cmap='gray')
plt.subplot(122)
plt.title('histequal')
plt.imshow( out,cmap='gray')
plt.show()

在这里插入图片描述

1.2.2 gamma变换

import cv2
import numpy as np
import matplotlib.pyplot as pltdef gamma(img,c=2,r=2):return np.array(c*img**r,dtype=np.uint8).clip(0,255)img = cv2.imread('/Users/liushuang/Desktop/LearnGit/项目实战/鱼苗检测/yolov5-master/opencv/features/cat.jpg')
out = gamma(img)
plt.subplot(121)
plt.title('org')
plt.imshow( img,cmap='gray')
plt.subplot(122)
plt.title('gamma')
plt.imshow( out,cmap='gray')
plt.show()

在这里插入图片描述

2 除噪

2.1 含义

除去图片上的噪声

2.2 方法

空间滤波法(均值滤波、高斯滤波、中值滤波、双边滤波),变换滤波(傅立叶,小波变换)、形态学等

2.2.1 高斯滤波

高斯滤波
高斯滤波适合处理呈正态分布的噪声。滤波器的特点是权值成正态分布。方差越大,滤波效果越明显;反之,效果越差。

import cv2
import numpy as np
import matplotlib.pyplot as pltdef guassian_filter(img, k_size=3, sigma=2):# 获取通道if len(img.shape) == 3:h, w, c = img.shapeelse:img = np.expand_dims(img, axis=-1)h, w, c = img.shape# img padiingpad = (k_size - 1) // 2out_put = np.zeros((h + pad * 2, w + pad * 2,3), dtype=np.float32)out_put[pad:pad + h, pad:pad + w] = img.copy().astype(np.float32)# generate kernelk = np.zeros((k_size, k_size), dtype = np.float32)for i in range(-pad, k_size - pad):for j in range(-pad, k_size - pad):k[j + pad, i + pad] = np.exp(-(i ** 2 + j ** 2) / (2 * sigma ** 2))k /= (2 * np.pi * sigma ** 2)k /= k.sum()tmp = out_put.copy()# Gaussian filterfor i in range(h):for j in range(w):for cc in range(c):out_put[pad + i, pad + j, cc] = np.sum(k * tmp[i:i + k_size, j:j + k_size, cc])out_put = np.clip(out_put, 0, 255)return out_put[pad:pad + h, pad:pad + w].astype(np.uint8)#
img = cv2.imread('opencv/features/dogGauss.jpeg')
out = guassian_filter(img, k_size=3, sigma=2)
plt.subplot(121)
plt.title('org')
plt.imshow( img[...,::-1])
plt.subplot(122)
plt.title('out')
plt.imshow( out[...,::-1])
plt.show()# sigma = 1 ,高斯核
'''
array([[0.07511362, 0.12384141, 0.07511362],[0.12384141, 0.20417996, 0.12384141],[0.07511362, 0.12384141, 0.07511362]], dtype=float32)# sigma = 3
array([[0.10699731, 0.11310981, 0.10699731],[0.11310981, 0.11957153, 0.11310981],[0.10699731, 0.11310981, 0.10699731]], dtype=float32)
'''

在这里插入图片描述

2.2.2 均值滤波

### 2.2.2 mean+filter
import cv2
import numpy as np
import matplotlib.pyplot as pltdef mean_filter(img, k_size=3):# shapeif len(img.shape) != 3:img = img[..., None]h, w, c = img.shape# 1 kernelk = np.ones((k_size, k_size), np.float32) / (k_size * k_size)# 2 out_Putpad = (k_size - 1) // 2out_put = np.zeros((h + 2*pad, w + 2*pad, c), np.float32)out_put[pad:pad + h, pad:pad + w] = img.copy().astype(np.float32)# 3 filtetmp = out_put.copy()for i in range(h):for j in range(w):for cc in range(c):out_put[pad + i:, pad + j, cc] = (tmp[i:i + k_size, j:j + k_size, cc] * k).sum()out_put = np.clip(out_put, 0, 255)return out_put[pad:pad + h, pad:pad + w].astype(np.uint8)# filteimg = cv2.imread('opencv/features/dogGauss.jpeg')
out = mean_filter(img, k_size=3)
plt.subplot(121)
plt.title('org')
plt.imshow(img[..., ::-1])
plt.subplot(122)
plt.title('out_mean_filter')
plt.imshow(out[..., ::-1])
plt.show()

在这里插入图片描述

2.2.3 中值滤波

取窗口的中位数作为中心点的值,如果效果不好,可以增大核的尺寸,或者多循环几次。

import cv2
import numpy as np
import matplotlib.pyplot as pltdef median_filter(img, k_size=10):# shapeif len(img.shape) != 3:img = img[..., None]h, w, c = img.shape# 2 out_Putpad = (k_size - 1) // 2out_put = np.ones((h + 2 * pad, w + 2 * pad, c), np.float32) * (-1)out_put[pad:pad + h, pad:pad + w] = img.copy().astype(np.float32)# 3 filtetmp = out_put.copy()for i in range(h):for j in range(w):for cc in range(c):t = tmp[i:i + k_size, j:j + k_size, cc]out_put[pad + i:, pad + j, cc] = np.median(t[t > 0])return out_put[pad:pad + h, pad:pad + w].astype(np.uint8)# filteimg = cv2.imread('opencv/features/letteropen.png')
out = median_filter(img, k_size=20)
plt.subplot(121)
plt.title('org')
plt.imshow(img[..., ::-1])
plt.subplot(122)
plt.title('median_filter')
plt.imshow(out[..., ::-1])
plt.show()

在这里插入图片描述

3 边缘检测

3.1 canny

canny 边缘检测流程

  1. 平滑处理
  2. 梯度检测
  3. 非极大值抑制
  4. 滞后阈值处理

import cv2 as cv
import numpy as np
import matplotlib.pyplot as pltdef canny(img):# 1. 平滑img_blur = cv.GaussianBlur(img, (5, 5), 2)# 2. 梯度gradx = cv.Sobel(img_blur, cv.CV_64F, 1, 0)  # xgrady = cv.Sobel(img_blur, cv.CV_64F, 0, 1)  # yR = np.abs(gradx) + np.abs(grady)T = np.arctan(grady / (gradx + 1e-3))# 3. 非极大值抑制,细化边缘h, w = R.shapeimg_thin = np.zeros_like(R)for i in range(1, h - 1):for j in range(1, w - 1):theta = T[i, j]if -np.pi / 8 <= theta < np.pi / 8:        #  (-22,22)if R[i, j] == max([R[i, j], R[i, j - 1], R[i, j + 1]]):            #  上下img_thin[i, j] = R[i, j]elif -3 * np.pi / 8 <= theta < -np.pi / 8:  #  (-66,-22)if R[i, j] == max([R[i, j], R[i - 1, j + 1], R[i + 1, j - 1]]):  #  斜线img_thin[i, j] = R[i, j]elif np.pi / 8 <= theta < 3 * np.pi / 8:    #  (22,66)if R[i, j] == max([R[i, j], R[i - 1, j - 1], R[i + 1, j + 1]]):  # 反斜线img_thin[i, j] = R[i, j]else:                                       #  (66,110)if R[i, j] == max([R[i, j], R[i - 1, j], R[i + 1, j]]):            # 左右img_thin[i, j] = R[i, j]# 4 双阈值抑制th1 = 5th2 = 30maxv = 255img_edge = np.zeros_like(img_thin)h, w = img_thin.shapefor i in range(1, h - 1):for j in range(1, w - 1):if img_thin[i, j] >= th2:img_edge[i, j] = maxvelif img_thin[i, j] > th1:around = img_thin[i - 1:i + 2, j - 1:j + 2]if around.max() >= th2:img_edge[i, j] = maxvreturn img_edgeimg = cv2.imread('opencv/features/letteropen.png', 0)
out = canny(img)
plt.subplot(121)
plt.title('org')
plt.imshow( img,cmap='gray')
plt.subplot(122)
plt.title('canny')
plt.imshow( out,cmap='gray')
plt.show()

在这里插入图片描述

4 HOG特征提取

4.1 含义

通过提取图像局部区域梯度直方图构成特征,进而获取整个图像的特征。HOG对几何和光学形变都能保持不变形。通过局部归一化,忽略细节的变化,提取共哦那个特性。

4.2 流程

img --> cells,blocks --> 计算每个cell的梯度直方图

4.3 案例

6 两个比赛

6.1 三个功能整合

6.2 目标检测

6.3 yolov5代码详解


http://www.ppmy.cn/news/81865.html

相关文章

电子招投标采购系统源码:采购过程更规范,更透明

满足采购业务全程数字化&#xff0c; 实现供应商管理、采购需求、全网寻源、全网比价、电子招 投标、合同订单执行的全过程管理。 电子招标采购&#xff0c;是指在网上寻源和采购产品和服务的过程。对于企业和企业主来说&#xff0c;这是个既省钱又能提高供应链效率的有效方法…

Linux学习 Day5(Linux环境安装/卸载软件)

目录 Linux 软件包管理器 yum 1.什么是软件包 2.关于 rzsz 3.注意事项 4.查看软件包 5.如何安装软件 6. 如何卸载软件 Linux 软件包管理器 yum 1.什么是软件包 在 Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 但是这…

交换机密码恢复

通常情况下&#xff0c;可以为交换机设置enable密码来提供安全&#xff0c;在没有enable密码的情况下&#xff0c;无法对交换机修改任何配置&#xff0c;因此&#xff0c;在忘记enable密码的时候&#xff0c;就意味着无法改动交换机信息。但是&#xff0c;如果能够物理上接触到…

Apache Flink 文件上传漏洞 (CVE-2020-17518)

文章目录 一、Apache Flink简介二、漏洞简介三、漏洞复现四、上传jar包getshell 一、Apache Flink简介 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任…

【Java校招面试】实战面经(六)

目录 前言一、如何在N个数中1前K小个数?二、TCP断开连接时为什么需要四次挥手?三、虚拟地址到物理地址的映射过程四、传输用户账号密码时如何加密?五、JSON为什么不存在数据库里?六、Redis是什么?七、Redis的过期策略八、Redis的淘汰策略九、写一个LRUCache十、ThreadLoca…

typescript一些语法糖

单个问号 ? 在定义类型里&#xff0c;代表非必须&#xff0c;可以帮助ide和lint进行静态检查 type UserInfo { username?: string; } 单个问号 ? 用于属性读取&#xff0c;表示如果不存在则返回空&#xff0c;减少一些检查空值的代码。 const valdata?.error.code;…

正向代理与反向代理:理解代理服务器在网络通信中的不同作用

1、正向代理和反向代理 正向代理&#xff08;Forward Proxy&#xff09;和反向代理&#xff08;Reverse Proxy&#xff09;是网络代理服务器的两种常见类型&#xff0c;它们在网络通信中起到不同的作用。 2、正向代理 正向代理&#xff08;Forward Proxy&#xff09;&#xf…

C++标准库算法std::upper_bound示例

C标准库算法std::upper_bound示例 贺志国 2023.5.25 C标准库算法std::upper_bound使用二分查找算法在已按升序排列的序列中返回指向第一个大于给定值的元素的迭代器&#xff0c;例如&#xff1a;已按升序排列的序列为{100.0, 101.5, 102.5, 102.5, 107.3}&#xff0c;第一个大…