首页 > 其他分享 >opencv—常用函数学习_“干货“_7

opencv—常用函数学习_“干货“_7

时间:2024-07-15 16:55:24浏览次数:11  
标签:函数 moments image cv2 查找 opencv 干货 图像 轮廓

目录

十九、模板匹配

从图像中提取矩形区域的子像素精度补偿 (getRectSubPix)

在图像中搜索和匹配模板 (matchTemplate)

比较两个形状(轮廓)的相似度 (matchShapes)

解释

二十、图像矩

计算图像或轮廓的矩 (moments)

计算图像或轮廓的Hu不变矩 (HuMoments)

解释

使用示例

二一、查找表变换

使用查找表对图像进行变换 (LUT)

解释

实际应用

伽马校正的示例

http://t.csdnimg.cn/i8pqt —— opencv—常用函数学习_“干货“_总(VIP)

散的正在一部分一部分发,不需要VIP。

资料整理不易,有用话给个赞和收藏吧。


十九、模板匹配

        在OpenCV中,模板匹配是图像处理和计算机视觉中的一种重要技术,用于在大图像中找到与模板图像匹配的区域。下面介绍一些常用的模板匹配函数及其使用示例。

模板匹配函数
getRectSubPixmatchTemplatematchShapes
从图像中提取矩形区域的子像素精度补偿在图像中搜索和匹配模板比较两个形状(轮廓)的相似度

从图像中提取矩形区域的子像素精度补偿 (getRectSubPix)
import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg')

# 定义中心和大小
center = (50, 50)
patch_size = (100, 100)

# 提取矩形区域
patch = cv2.getRectSubPix(image, patch_size, center)

cv2.imshow('Original Image', image)
cv2.imshow('Extracted Patch', patch)
cv2.waitKey(0)
cv2.destroyAllWindows()
在图像中搜索和匹配模板 (matchTemplate)
# 读取图像和模板
image = cv2.imread('path_to_image.jpg', 0)
template = cv2.imread('path_to_template.jpg', 0)

# 进行模板匹配
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

# 获取最佳匹配位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# 绘制匹配结果
top_left = max_loc
h, w = template.shape
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(image, top_left, bottom_right, 255, 2)

cv2.imshow('Template Matched', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
比较两个形状(轮廓)的相似度 (matchShapes)
# 读取图像并转换为灰度图
image1 = cv2.imread('path_to_image1.jpg', 0)
image2 = cv2.imread('path_to_image2.jpg', 0)

# 阈值化
_, binary1 = cv2.threshold(image1, 127, 255, cv2.THRESH_BINARY)
_, binary2 = cv2.threshold(image2, 127, 255, cv2.THRESH_BINARY)

# 提取轮廓
contours1, _ = cv2.findContours(binary1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
contours2, _ = cv2.findContours(binary2, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 计算相似度
if contours1 and contours2:
    similarity = cv2.matchShapes(contours1[0], contours2[0], cv2.CONTOURS_MATCH_I1, 0.0)
    print(f'Shape similarity: {similarity}')

解释

  • getRectSubPix:从图像中提取矩形区域的子像素精度补偿,适用于需要高精度提取的场景。
  • matchTemplate:在大图像中搜索和匹配模板,返回一个相似度图,可以进一步处理以找到最佳匹配位置。
  • matchShapes:比较两个形状(轮廓)的相似度,返回一个相似度值,值越小表示形状越相似。

这些示例展示了如何使用OpenCV中的各种模板匹配函数来处理图像。根据具体的应用需求,可以灵活运用这些函数来实现复杂的模板匹配任务。

二十、图像矩

        在OpenCV中,图像矩是图像的一个重要特征,用于描述图像的形状和分布。常用的图像矩函数包括 momentsHuMoments。下面介绍这些函数及其使用示例。

图像矩函数
momentsHuMoments
计算图像或轮廓的矩计算图像或轮廓的Hu不变矩
计算图像或轮廓的矩 (moments)
import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用阈值处理
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 计算轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 计算第一个轮廓的矩
if contours:
    moments = cv2.moments(contours[0])
    print("Moments:", moments)
计算图像或轮廓的Hu不变矩 (HuMoments)
# 计算第一个轮廓的矩
if contours:
    moments = cv2.moments(contours[0])

    # 计算Hu不变矩
    hu_moments = cv2.HuMoments(moments).flatten()
    print("Hu Moments:", hu_moments)

解释

  • moments:计算图像或轮廓的矩,返回一个包含多种矩(如零阶矩、一阶矩、二阶矩等)的字典。这些矩可以用来计算图像的质心、面积、惯性矩等。
  • HuMoments:根据普通矩计算Hu不变矩,返回7个不变矩。这些不变矩对图像的缩放、旋转和镜像变换保持不变,是一种强有力的形状特征。

使用示例

        下面是一个综合的示例,展示了如何使用momentsHuMoments来计算图像或轮廓的矩和不变矩。

import cv2
import numpy as np

# 读取图像并转换为灰度图
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)

# 应用阈值处理
_, binary_image = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)

# 计算轮廓
contours, _ = cv2.findContours(binary_image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 计算第一个轮廓的矩和Hu不变矩
if contours:
    contour = contours[0]
    
    # 计算矩
    moments = cv2.moments(contour)
    print("Moments:", moments)
    
    # 计算质心
    cX = int(moments["m10"] / moments["m00"])
    cY = int(moments["m01"] / moments["m00"])
    print("Centroid:", (cX, cY))
    
    # 计算Hu不变矩
    hu_moments = cv2.HuMoments(moments).flatten()
    print("Hu Moments:", hu_moments)
    
    # 在图像上绘制轮廓和质心
    image_color = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
    cv2.drawContours(image_color, [contour], -1, (0, 255, 0), 2)
    cv2.circle(image_color, (cX, cY), 5, (0, 0, 255), -1)
    cv2.imshow("Contour with Centroid", image_color)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

        这些示例展示了如何使用OpenCV中的图像矩函数来处理图像,根据具体的应用需求,可以灵活运用这些函数来实现复杂的图像特征提取和分析任务。

二一、查找表变换

        在OpenCV中,查找表(LUT,Look-Up Table)变换是一种高效的像素值映射方法,用于对图像进行各种非线性变换。通过预先定义一个查找表,可以快速地将输入图像的像素值转换为输出图像的像素值。OpenCV提供了LUT函数来实现这一功能。

查找表变换函数
LUT使用查找表对图像进行变换

使用查找表对图像进行变换 (LUT)
import cv2
import numpy as np

# 读取图像
image = cv2.imread('path_to_image.jpg', cv2.IMREAD_GRAYSCALE)

# 定义一个查找表,将像素值变换为其平方根的结果
lut = np.array([np.sqrt(i) * 16 for i in range(256)], dtype=np.uint8)

# 应用查找表变换
result_image = cv2.LUT(image, lut)

# 显示原图像和变换后的图像
cv2.imshow('Original Image', image)
cv2.imshow('LUT Transformed Image', result_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

解释

  • 定义查找表:在这个示例中,我们定义了一个查找表lut,将每个像素值映射到其平方根乘以16的值。np.sqrt(i) * 16用于计算像素值的平方根并放大以增加对比度。
  • 应用查找表变换:使用cv2.LUT函数将查找表应用于图像。这将图像中的每个像素值替换为查找表中对应的值。

实际应用

        查找表变换在图像处理中的应用非常广泛,常用于以下场景:

  1. 伽马校正:调整图像的亮度和对比度。
  2. 颜色映射:将灰度图像映射到伪彩色图像。
  3. 非线性增强:对图像进行对数变换、指数变换等非线性增强。
伽马校正的示例
# 伽马校正的查找表
gamma = 2.2
lut = np.array([((i / 255.0) ** gamma) * 255 for i in range(256)], dtype=np.uint8)

# 应用查找表变换
gamma_corrected_image = cv2.LUT(image, lut)

# 显示伽马校正后的图像
cv2.imshow('Gamma Corrected Image', gamma_corrected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

        在这个示例中,我们定义了一个用于伽马校正的查找表lut,并将其应用于图像以实现伽马校正效果。

        通过这些示例,可以看到如何使用OpenCV中的LUT函数来实现各种查找表变换。根据具体的应用需求,可以灵活定义查找表并应用于图像处理任务。

标签:函数,moments,image,cv2,查找,opencv,干货,图像,轮廓
From: https://blog.csdn.net/chen_0717/article/details/140443404

相关文章

  • kotlin标准函数let apply等分析
    在kotlin中,在standard.kt中定义了一些标准的方法,这里对这些方法进行挨个的阅读TODO方法这方法比较简单,就是直接抛出一个异常,这里有一个inline关键字,定义的是一个内联方法,内联方法的意思是调用时整个方法的代码一起替换过去,下面是TODO方法的源码publicinlinefunTODO(......
  • pytorch的expand函数
    PyTorch中的expand函数用于扩展张量的形状,使其在某些维度上“看起来”像被复制了多次,但实际上它不会复制数据,从而节省内存和计算资源。扩展后的张量共享原始张量的内存空间,因此原始张量和扩展后的张量是同一个数据的视图。以下是torch.expand函数的一些基本用法:1.扩展一维......
  • OpenCV——实现视频图像抖动的效果
    #Jitterimportcv2importnumpyasnp#视频路径和输出路径input_video_path=r'D:\desk\20240713_test\Ori_Videos\ori_videos\IR\ir_shake_20240713.mp4'output_video_path=r'D:\desk\20240713_test\Ori_Videos\enhance\IR\jitter\jitter_20.......
  • OpenCV——实现视频图像的来回摆动的效果
    #Swingimportcv2defrotate_img(image,angle):#Readingtheimage#dividingheightandwidthby2togetthecenteroftheimageheight,width=image.shape[:2]#getthecentercoordinatesoftheimagetocreatethe2Drotationmatr......
  • 函数的微分(彻底理清)
    问题引入计算一个边长为xxx的正方体的面积,函数为y=f(x)=x2y=f(x)=x^2y=f(x)=x2。当自变量xxx取得增量Δx\DeltaxΔx时,函数值取得的增量为Δy=f(x0+Δx)−f(x0)\Deltay=f(x_0+\Deltax)-f(x_0)Δy=f(x0​+Δx)−f(x0​)......
  • Python函数进阶
    1.多返回值返回值为return返回给上级函数的值,需要注意的是,与C和C++不同,Python中可以有多返回值。多返回值deftest_return():return1,2x,y=test_return()print(x)print(y)特点:按照返回值的顺序,写对应顺序的多个变量接收即可变量之间用逗号隔开支持不同......
  • OpenCV图像处理——霍夫圆检测与最小二乘法拟合圆
    HoughCircles:霍夫圆检测voidHoughCircles(InputArrayimage,OutputArraycircles,intmethod,doubledp,doubleminDist,doubleparam1=100,doubleparam2=100,intminRadius=0,intmaxRadius=0);image:输入,8-bit单通道灰度图circles:输出,vector,含有3或......
  • OpenCV图像处理——判断轮廓是否在圆环内
    要判断一个轮廓是否在圆环内,可以将问题分解为两个步骤:确保轮廓的所有点都在外圆内。确保轮廓的所有点都在内圆外。下面是一个完整的示例代码,展示如何实现这一点:#include<opencv2/opencv.hpp>#include<iostream>#include<vector>#include<cmath>usingnamespace......
  • Kotlin标准函数(语法糖)let with run also apply快速讲解
    目录1、知识储备——扩展函数原理定义扩展函数调用扩展函数2、返回值为上下文对象的标准函数applyalso3、返回值为Lambda表达式结果letrunwith4、一表总结1、知识储备——扩展函数原理Kotlin在不继承父类或实现接口下,也能扩展一个类的新功能定义扩展函数f......
  • 教你创建Python函数信手拈来哦(递归函数)
    Python中函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段函数能提高应用的模块性,和代码的重复利用率Python提供了许多内建函数,比如print()、type()、类型转换函数等等用户也可以自己创建函数,这被叫做用户自定义函数一、定义函数1.创建函数函数使用def关键......