实现openCV-python批量转换图片质心坐标输出txt源码——包括单个多个质心,以及批量可视化输出

本文主要是介绍实现openCV-python批量转换图片质心坐标输出txt源码——包括单个多个质心,以及批量可视化输出,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
实现openCV-python批量转换质心坐标输出txt源码案例,批量化操作。

import cv2
import os
import numpy as np
import functools
def sys_moments(img):moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩humoment = -(np.log(np.abs(humoments)))/np.log(10)return humoment
def main():f1 = open("S:\\AdobeppPS\\ceshi02.txt",'w+')input_dir = "S:\\AdobeppPS\\SKOO\\"aa = os.listdir( input_dir) abc=0set_list = []list00=[]tholdzz=127zs=len(aa)*7cxx=[]cyy=[]for ia in aa:grayy=cv2.imread(input_dir+ia,0)
#         gray_image = cv2.cvtColor(grayy, cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(gray_image,tholdzz,255,0)ret,thresh = cv2.threshold(grayy,tholdzz,255,0)M = cv2.moments(thresh)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])cxx.append(cX)cyy.append(cY)cv2.circle(grayy, (cX, cY), 5, (255, 255, 255), -1)cv2.putText(grayy, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)print("质心坐标为:",cX,cY)     arr1=sys_moments(grayy)  for item in range(len(arr1)):s=arr1[item,0]set_list.append(s)list00.append(s)for cs0 in range(zs):if cs0%7==0:abc=abc+1f1.write("第 "+str(abc)+"张图片的质心坐标为:"+str(cxx[abc-1])+"\t"+str(cyy[abc-1]) +"\n")f1.close()    
if __name__ == '__main__':main()   print("well done")    

全套整理质心源码如下:
包括单个,多个质心,以及批量化输出

#单个质心获取
import cv2
import numpy as np 
img01="S:\\AdobeppPS\\SKOO\\cc15.jpg"
img = cv2.imread(img01) 
# convert image to grayscale image
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
# convert the grayscale image to binary image
ret,thresh = cv2.threshold(gray_image,127,255,0) 
# calculate moments of binary image
M = cv2.moments(thresh) 
# calculate x,y coordinate of center
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"]) 
# put text and highlight the center
cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)
cv2.putText(img, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)# display the image
cv2.imshow("Image", img)
cv2.waitKey(0)
print("质心坐标为:",cX,cY)'''#多质心
import cv2
import numpy as np 
img01="S:\\AdobeppPS\\SKOO\\cc99.jpg"
img = cv2.imread(img01) 
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# convert the grayscale image to binary image
ret,thresh = cv2.threshold(gray_image,127,255,0) 
# find contour in the binary image
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
# find contour in the binary image(opencv4)
#binary, contours, opt  = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
# calculate moments for each contour
M = cv2.moments(c)
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# calculate x,y coordinate of center
cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)
cv2.putText(img, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# show the image
cv2.imshow("Image", img)
cv2.waitKey(0)
print(cX,cY)#批量化输出
import cv2
import os
import numpy as np
import functools
def sys_moments(img):moments = cv2.moments(img)#返回的是一个字典,三阶及以下的几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)humoments = cv2.HuMoments(moments)#根据几何矩(mpq)、中心矩(mupq)和归一化的矩(nupq)计算出hu不变矩humoment = -(np.log(np.abs(humoments)))/np.log(10)return humoment
def main():f1 = open("S:\\AdobeppPS\\ceshi02.txt",'w+')input_dir = "S:\\AdobeppPS\\SKOO\\"aa = os.listdir( input_dir) abc=0set_list = []list00=[]tholdzz=127zs=len(aa)*7cxx=[]cyy=[]for ia in aa:grayy=cv2.imread(input_dir+ia,0)
#         gray_image = cv2.cvtColor(grayy, cv2.COLOR_BGR2GRAY)ret,thresh = cv2.threshold(gray_image,tholdzz,255,0)ret,thresh = cv2.threshold(grayy,tholdzz,255,0)M = cv2.moments(thresh)cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])cxx.append(cX)cyy.append(cY)cv2.circle(grayy, (cX, cY), 5, (255, 255, 255), -1)cv2.putText(grayy, "centroid", (cX - 25, cY - 25),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
#         print("质心坐标为:",cX,cY)     arr1=sys_moments(grayy)  for item in range(len(arr1)):s=arr1[item,0]set_list.append(s)list00.append(s)for cs0 in range(zs):if cs0%7==0:abc=abc+1#         f1.write("第 "+str(abc)+"张图片:\t"+str(format(list00[cs0],".3f"))+"\n")f1.write("第 "+str(abc)+"张图片的质心坐标为:"+str(cxx[abc-1])+"\t"+str(cyy[abc-1]) +"\n")f1.close()    
if __name__ == '__main__':main()   print("well done")    
'''

附注插上:
OpenCV函数resize原型:
cv2.resize(InputArray src, OutputArray dst, Size, fx, fy, interpolation)
参数解释:
InputArray src 输入图片
OutputArray dst 输出图片
Size 输出图片尺寸
fx, fy 沿x轴,y轴的缩放系数
1.输出尺寸格式为(宽,高)
2.默认的插值方法为:双线性插值

interpolation 插入方式----官网介绍

interpolation 选项所用的插值方法:
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 双线性插值(默认使用)
INTER_AREA - 使用像素区域关系重新采样。它可能是图像抽取的首选方法,因为它提供无摩尔纹的结果。但是当图像被放大时,它的INTER_NEAREST 方法是类似的 。
INTER_CUBIC - 4x4 像素邻域上的双三次插值
INTER_LANCZOS4 - 8x8 像素邻域上的 Lanczos 插值

在某些情况下,我们需要使用不同分辨率的(相同)图像。例如,当在图像中搜索某些东西(例如人脸)时,我们不确定对象将以多大的尺寸显示在图像中。在这种情况下,我们将需要创建一组具有不同分辨率的相同图像,并在所有图像中搜索对象。这些具有不同分辨率的图像集称为“图像金字塔”(因为当它们堆叠在底部时,最高分辨率的图像位于顶部,最低分辨率的图像位于顶部时,看起来像金字塔)。

有两种图像金字塔。1)高斯金字塔和2)拉普拉斯金字塔

1、高斯金字塔

高斯金字塔中的较高级别(低分辨率)是通过删除较低级别(较高分辨率)图像中的连续行和列而形成的。然后,较高级别的每个像素由基础级别的5个像素的贡献与高斯权重形成。通过这样做,M×N图像变成M/2×N/2图像。因此面积减少到原始面积的四分之一。它称为Octave。当我们在金字塔中越靠上时(即分辨率下降),这种模式就会继续。同样,在扩展时,每个级别的面积变为4倍。我们可以使用cv.pyrDown()和cv.pyrUp()函数找到高斯金字塔。
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
from google.colab.patches import cv2_imshow
img=cv.imread(‘梅西.jpg’,1)
lower_reso1 = cv.pyrDown(img)
lower_reso2 = cv.pyrDown(lower_reso1)
cv2_imshow(img)
cv2_imshow(lower_reso1)
cv2_imshow(lower_reso2)

higher_reso1 = cv.pyrUp(lower_reso1)

拉普拉斯金字塔由高斯金字塔形成。没有专用功能。拉普拉斯金字塔图像仅像边缘图像。它的大多数元素为零。它们用于图像压缩。拉普拉斯金字塔的层由高斯金字塔的层与高斯金字塔的高层的扩展版本之间的差形成。拉普拉斯等级的三个等级如下所示(调整对比度以增强内容):要求:拉普拉斯金字塔时,图像大小必须是2的n次方*2的n次方,不然会报错。

金字塔的一种应用是图像融合。例如,在图像拼接中,您需要将两个图像堆叠在一起,但是由于图像之间的不连续性,可能看起来不太好。在这种情况下,使用金字塔混合图像可以无缝混合,而不会在图像中保留大量数据。

更多

图像金字塔就是用来进行图像缩放的,干的事情跟resize函数没两样,那我们还需要学它吗?我觉得有必要的额,因为在学习卷积神经网络一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低。
两种类型的金字塔:
高斯金字塔:用于下采样,主要的图像金字塔;
拉普拉斯金字塔:用于重建图像,也就是预测残差(我的理解是,因为小图像放大,必须插入一些像素值,那这些像素值是什么才合适呢,那就得进行根据周围像素进行预测),对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像,
图像金字塔有两个高频出现的名词:上采样和下采样。
上采样:就是图片放大(所谓上嘛,就是变大),使用PryUp函数
下采样:就是图片缩小(所谓下嘛,就是变小),使用PryDown函数
下采样将步骤:
对图像进行高斯内核卷积
将所有偶数行和列去除
下采样就是图像压缩,会丢失图像信息。
上采样步骤:
将图像在每个方向放大为原来的两倍,新增的行和列用0填充;
使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。
上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。
下面给出OpenCV中pryUp和pryDown的用法
无论是放大还是缩小,图像都变得模糊了,这就是他的致命缺点。

新版

# 单个质心获取
import cv2
import numpy as np
# img01 = "S:\\AdobeppPS\\SKOO\\cc15.jpg"
img01 = "D:\\Pictures\\cscscs\\sc16.jpg"
img = cv2.imread(img01)
# convert image to grayscale image
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# convert the grayscale image to binary image
ret, thresh = cv2.threshold(gray_image, 127, 255, 0)
# calculate moments of binary image
M = cv2.moments(thresh)
# calculate x,y coordinate of center
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
# put text and highlight the center
cv2.circle(img, (cX, cY), 5, (255, 255, 255), -1)
cv2.putText(img, "centroid", (cX - 25, cY - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# display the image
cv2.imshow("Image", img)
print("质心坐标为:"+"(" +str(cX)+","+str(cY)+")")
cv2.waitKey(0)

这篇关于实现openCV-python批量转换图片质心坐标输出txt源码——包括单个多个质心,以及批量可视化输出的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830934

相关文章

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python使用Pandas对比两列数据取最大值的五种方法

《Python使用Pandas对比两列数据取最大值的五种方法》本文主要介绍使用Pandas对比两列数据取最大值的五种方法,包括使用max方法、apply方法结合lambda函数、函数、clip方法、w... 目录引言一、使用max方法二、使用apply方法结合lambda函数三、使用np.maximum函数

MySQL8.0设置redo缓存大小的实现

《MySQL8.0设置redo缓存大小的实现》本文主要在MySQL8.0.30及之后版本中使用innodb_redo_log_capacity参数在线更改redo缓存文件大小,下面就来介绍一下,具有一... mysql 8.0.30及之后版本可以使用innodb_redo_log_capacity参数来更改

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在