实现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

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使