OpenCV4(10)-图像像素值统计(C++,Python,JS)

图像灰度化:从原理到实战,计算机视觉预处理的核心技术 图像灰度化是数字图像处理与计算机视觉领域的一项基础且关键的预处理技术。其核心原理是将包含红、绿、蓝三通道的彩色图像,通过特定的算法转换为一幅仅包含亮度信息的单通道图像,实现数据降维。这一过程不仅大幅减少了计算和存储开销,更重要的是,它通过剥离色彩干扰,使算法能够聚焦于图像的结构、纹理和边缘等本质特征,从而提升后续分析的效率和鲁棒性。在技术实现上,基于人眼视觉特性的加权平均法(如使用0.299, 0.587, 0.114系数)因其在效果与性能间的平衡而成为行业标准,被广泛应用于OpenCV等主流库中。该技术的 阅读详情

目录

环境

知识点

C++代码

Python代码

JS代码

结果展示

返回总目录


环境

  • Python:3.6.5 OpenCV 4.1.2
  • C++:OpenCV 4.1.2
  • JS:OpenCV 4.5.0

环境搭建可参考:B站视频

知识点

像素值统计

- 最小(min)

- 最大(max)

- 均值(mean)

- 标准方差(standard deviation)

相关API

- 最大最小值minMaxLoc

minMaxLoc() 函数要求输入图像必须是 CV_8UC1 类型的,否则会报错。

- 计算均值与标准方差meanStdDev

meanStdDev(Mat src, MatOfDouble mean, MatOfDouble stddev)

- src 表示输入 Mat 图像

- mean 表示计算出各个通道的均值,数组长度与通道数目一致

- stddev 表示计算出各个通道的标准方差,数组长度与通道数目一致

C++代码

#ifndef DAY10
#define DAY10

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void day10() {

	// 读取一张灰度图像
	Mat src_gray = imread("E:\\_Image\\OpenCVTest\\girl.jpg", IMREAD_GRAYSCALE);
	if (src_gray.empty()) {
		cout << "could not load image.." << endl;
		return;
	}
	imshow("src_gray", src_gray);

	if (src_gray.type() == CV_8UC1) {
		double minVal = 0, maxVal = 0;
		Point minLoc, maxLoc;
		minMaxLoc(src_gray, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
		printf("min: %.2f, max: %.2f\n", minVal, maxVal);
		printf("min loc: (%d, %d)\n", minLoc.x, minLoc.y);
		printf("max loc: (%d, %d)\n", maxLoc.x, maxLoc.y);
	}
	else {
		cout << "not gray image.." << endl;
	}
	
	// 读取一张三通道彩色图像,获得它的均值和方差
	Mat src_color = imread("E:\\_Image\\OpenCVTest\\girl.jpg");
	if (src_color.empty()) {
		cout << "could not load image.." << endl;
		return;
	}
	imshow("src_color", src_color);

	Mat mean, stddev;
	meanStdDev(src_color, mean, stddev);
	printf("blue channel -> mean: %.2f, stddev: %2f\n", mean.at<double>(0, 0), stddev.at<double>(0, 0));
	printf("green channel -> mean: %.2f, stddev: %2f\n", mean.at<double>(1, 0), stddev.at<double>(1, 0));
	printf("red channel -> mean: %.2f, stddev: %2f\n", mean.at<double>(2, 0), stddev.at<double>(2, 0));
	
	// 根据图像的均值将彩色图像转换为二值图像
	for (int row = 0; row < src_color.rows; row++) {
		for (int col = 0; col < src_color.cols; col++) {
			Vec3b bgr = src_color.at<Vec3b>(row, col);
			bgr[0] = bgr[0] < mean.at<double>(0, 0) ? 0 : 255;
			bgr[1] = bgr[1] < mean.at<double>(1, 0) ? 0 : 255;
			bgr[2] = bgr[2] < mean.at<double>(2, 0) ? 0 : 255;
			src_color.at<Vec3b>(row, col) = bgr;
		}
	}
	imshow("binary", src_color);

	waitKey(0);
}

#endif // !DAY10

Python代码

import cv2 as cv
import numpy as np

# 查看版本
print(cv.__version__)

# 读取和显示图像
src = cv.imread("E:/_Image/OpenCVTest/girl.jpg", cv.IMREAD_GRAYSCALE)
cv.imshow("src", src)

# 获取灰度图的极值及位置
mmin, mmax, minLoc, maxLoc = cv.minMaxLoc(src)
print("min: %.2f, max: %.2f" % (mmin, mmax))
print("minLoc: ", minLoc)
print("maxLoc: ", maxLoc)

# 获取灰度图的均值和方差
means, stddev = cv.meanStdDev(src)
print("means: %.2f, stddev: %.2f" % (means, stddev))
src[np.where(src < means)] = 0
src[np.where(src > means)] = 255
cv.imshow("binary", src)

## 彩色图像二值化
src = cv.imread("E:/_Image/OpenCVTest/girl.jpg")
cv.imshow("color", src)
h, w, ch = src.shape
means, stddev = cv.meanStdDev(src)
print("blue channel -> means: %.2f, stddev: %.2f" % (means[0], stddev[0]))
print("green channel -> means: %.2f, stddev: %.2f" % (means[1], stddev[1]))
print("red channel -> means: %.2f, stddev: %.2f" % (means[2], stddev[2]))
print("h, w, ch", h, w, ch)
for row in range(h):
    for col in range(w):
        b, g, r = src[row, col]
        b = 0 if b < means[0] else 255
        g = 0 if g < means[1] else 255
        r = 0 if r < means[2] else 255
        src[row, col] = [b, g, r]
cv.imshow("color_binary", src)

# 等待键盘输入,释放内存
cv.waitKey()
cv.destroyAllWindows()

JS代码

<template>
  <div>
    <p>图像像素值统计</p>
    <p id="status">OpenCV.js is loading...</p>
    <div class="inputoutput">
      <img id="imageSrc" src="imgs/girl.jpg" />
    </div>
    <div class="inputoutput">
      <canvas id="canvasOutput"></canvas>
      <div class="caption">canvasOutput</div>
    </div>
  </div>
</template>

<script>
export default {
  name: "day10",
  mounted() {
    this.init();
  },
  destoryed() {},
  data() {
    return {
      mats: [],
    };
  },
  methods: {
    init() {
      setTimeout(() => {
        if (window.cv) {
          this.onOpenCvReady(window.cv);
        } else {
          this.init();
        }
      }, 500);
    },
    onOpenCvReady(cv) {
      document.getElementById("status").innerHTML = "OpenCV.js is ready.";

      // 官方文档链接:

      // 读取图像
      let src = this.createMat(cv, 1, { name: "imageSrc" });

      // 转化到 gray 色彩空间
      let gray = this.createMat(cv, 2);
      cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY);

      // 计算灰度图的极值和位置
      // 和 C++,Python 程序运行的结果不一致,感到很奇怪
      if (gray.type() === cv.CV_8UC1) {
        let ret = cv.minMaxLoc(gray);
        console.log(ret);
      }

      // 计算彩色图的均值和方差
      let bgr = this.createMat(cv, 2);
      cv.cvtColor(src, bgr, cv.COLOR_RGBA2BGR);
      let means = this.createMat(cv, 2);
      let stddev = this.createMat(cv, 2);
      cv.meanStdDev(bgr, means, stddev);
      //   this.showImgInfo(means)
      //   this.showImgInfo(stddev)
      // 和 C++,Python 程序运行的结果不一致,感到很奇怪
      console.log(`blue channel -> mean: ${means.ucharAt(0, 0)}, stddev: ${stddev.ucharAt(0, 0)}`);
      console.log(`green channel -> mean: ${means.ucharAt(1, 0)}, stddev: ${stddev.ucharAt(1, 0)}`);
      console.log(`red channel -> mean: ${means.ucharAt(2, 0)}, stddev: ${stddev.ucharAt(2, 0)}`);

      // 显示图像
      cv.imshow("canvasOutput", gray);

      // 销毁所有 mat
      this.destoryAllMats();
    },
    createMat(cv, type, ops) {
      switch (type) {
        case 1:
          if (ops && ops.name) {
            let mat = cv.imread(ops.name);
            this.mats.push(mat);
            return mat;
          }
          break;
        case 2: {
          let mat = new cv.Mat();
          this.mats.push(mat);
          return mat;
        }
        case 3:
          if (ops && ops.rows && ops.cols && ops.type && ops.initValue) {
            let mat = new cv.Mat(ops.rows, ops.cols, ops.type, ops.initValue);
            this.mats.push(mat);
            return mat;
          }
          break;
        default:
          break;
      }
    },
    showImgInfo(src) {
      console.log("img size :", src.size());
      console.log("img type :", src.type());
      console.log("img cols :", src.cols);
      console.log("img rows :", src.rows);
      console.log("img depth:", src.depth());
      console.log("img channels:", src.channels());
    },
    destoryAllMats() {
      let i = 0;
      this.mats.forEach((item) => {
        item.delete();
        i++;
      });
      console.log("销毁图象数:", i);
    },
  },
};
</script>

<style lang="scss" scoped>
</style>

补充说明:我并没有在官方文档中找到这次的 js 版本的 API 说明。更显奇怪的是,js 的统计结果和 c++ 还有 Python 的统计结果是不一致的,但 c++ 和 python 的结果是一致的,如果有小伙伴知道原因,欢迎私信我或给我留言。

结果展示

返回总目录

OpenCV4学习笔记 - 目录

如果这篇文章对您有帮助,欢迎给我的 github项目 点一个⭐ ο(=•ω<=)ρ⌒☆

基于PyQt的图像查看器GUI开发:从原理到高性能实现 图形用户界面(GUI)是人机交互的核心技术,通过可视化控件和事件驱动机制,将复杂操作转化为直观的点击与拖拽。其底层原理通常基于模型-视图-控制器(MVC)架构,实现数据、界面与逻辑的分离,从而提升代码的可维护性和扩展性。在图像处理领域,GUI的技术价值尤为突出,它能够将专业的图像算法封装为易用的工具,大幅降低使用门槛,提升科研与工程效率。典型的应用场景包括医学影像分析、遥感数据处理、工业质检和数字摄影工作流等。本文聚焦于图像查看器这一细分场景,深入探讨如何利用PyQt框架构建支持大图像渲染、实时像素分析和交 阅读详情

相关推荐

基于行空板与OpenCV DNN的轻量级车辆检测边缘计算实践

边缘计算通过在数据源头就近处理信息,有效解决了云计算模式下的延迟、带宽和隐私问题,成为物联网和智能终端的关键技术。其核心原理是将计算任务从中心云下沉到网络边缘的设备上。在计算机视觉领域,这一技术价值尤为突出,它使得实时图像分析(如目标检测)在资源受限的嵌入式设备上成为可能。OpenCV DNN模块作为轻量高效的推理引擎,能够加载并运行多种预训练模型,是实现边缘视觉应用的常用工具。结合专为嵌入式教育设计的行空板,开发者可以构建低功耗、一体化的智能感知装置。本文即以车辆检测为具体应用场景,详细阐述了如何利用行空

weixin_33895516的博客 525

C++ OpenCV(三):图像像素统计

API 最大值和最小值 CV_EXPORTS_W void minMaxLoc(InputArray src, CV_OUT double* minVal, CV_OUT double* maxVal = 0, CV_OUT Point* minLoc = 0, CV_OUT Point* maxLoc = 0, InputArray mask = noArray()); 参数一:src,单通

AndroidKt 1583

滑块验证码逆向实战:从JS加密到轨迹模拟的完整攻防解析

在Web安全与自动化测试领域,验证码是识别机器行为的关键防线。其核心原理是通过前端交互生成动态参数,后端验证以实现人机识别。从技术价值看,理解验证码机制不仅能提升自动化脚本的可靠性,也是学习前端安全与逆向工程的重要实践。常见的应用场景包括数据采集、自动化测试和风控策略研究。本文聚焦于滑块验证码这一典型形态,深入剖析其前端JavaScript加密逻辑和轨迹模拟技术,通过逆向分析网络请求与加密函数,结合ExecJS等工具实现参数生成,并探讨拟人化轨迹算法以对抗行为检测。

dflkg8956的专栏 390

计算图像的均值、标准差

均值反映了图像的亮度,均值越大说明图像亮度越大,反之越小; 标准差反映了图像像素值与均值的离散程度,标准差越大说明图像的质量越好; meanStdDev()函数用于计算一个矩阵的均值和标准差,它的声明如下: void cv::meanStdDev ( InputArray src, OutputArray mean, OutputArray ...

xiachong27的博客 1万+

LaMa图像修复原理:傅里叶卷积与分辨率鲁棒性解析

图像修复是计算机视觉中基础且关键的任务,其核心在于根据已知像素重建缺失区域的结构与纹理。传统方法依赖空间域卷积,受限于感受野与长程依赖建模能力,难以应对大区域遮挡和跨尺度一致性挑战。LaMa通过引入傅里叶卷积,在频率域实现全局关联建模,天然具备无限感受野与分辨率鲁棒性,显著提升大mask修复的结构保真度与泛化能力。该技术已在电商修图、老照片数字化、游戏资产清理等真实工业场景落地验证,兼顾精度、速度与部署稳定性。本文深入剖析其频域建模原理、工程实现要点及生产级调优策略。

张 作强 BLOG 513

【opencv-c++】统计图像像素的均值以及标准差

如果输入图像只有一个通道,那么返回值的后 3 位都是0.可以通过 cv::Scalar[n] 查看第 n 个通道的平均值。以下示例,分别使用cv::mean、cv::meanStdDev函数接口。图像的平均值表示图像整体的亮暗程度,平均值越大,则图像整体越亮。如果计算方差又计算均值,用接口:cv::meanStdDev。函数的返回值有 4 位,分别表示输入图像的4 个通道的平均值,其中,src:待求平均值的图像矩阵(通道数可以位1~4)。如果只计算均值,用接口:cv::mean。

jn10010537的博客 2415

OpenCV4学习笔记 - 目录

前言 OpenCV4 学习笔记,实践于 C++、Python 和 JS(Vue)代码 以下文章均收录在我的 GitHub 中,欢迎 Star ⭐ ο(=•ω<=)ρ⌒☆ 环境 Python:3.6.5 OpenCV 4.1.2 C++:OpenCV 4.1.2 JS:OpenCV 4.5.0 环境搭建可参考:B站视频 目录 入门 OpenCV4(1)-读取和显示图像(C++,Python,JS) OpenCV4(2)-保存图像与色彩空间的转换(C++,Python,JS) OpenCV4(3)-图像对

Apple_Coco的博客 1006

基于C++的OpenCV4入门基础--图像轮廓

基于C++的OpenCV4的图像轮廓用法说明

jiangchaobing_2017的博客 338

【图像处理】利用numpy实现直方图均衡、自适应直方图均衡、对比度受限自适应直方图均衡

直方图均衡化是一种在图像处理技术,通过调整图像的直方图来增强图像的对比度。本博客不利用opencv库,

Jamence的博客 1637

openCV-2.4.9 小图在大图中位置

log

shengyin714959的博客 843

OpenCV+MySQL+QT构建工业级本地考勤系统

人脸识别考勤系统本质是图像识别、结构化数据管理与跨平台人机交互的工程集成。其核心在于将人脸特征转化为可审计的业务数据,而非单纯算法精度比拼。OpenCV提供轻量可控的LBPH识别引擎,免训练、易调试,适配边缘硬件;MySQL通过事务控制、行级锁与存储过程保障考勤数据的一致性与可追溯性;QT以原生C++实现Windows/Linux/ARM三端统一部署,规避Web依赖与环境兼容风险。该技术栈特别适用于中小制造企业降本增效、计算机专业毕业设计落地及AI项目从Demo走向产线的实际需求。

weixin_34099526的博客 317

python手势识别滑动ppt_Python实现图片滑动式验证识别

原标题:Python实现图片滑动式验证识别本文分享自 Linux 视野。滑动式验证码现在使用越来越广泛了,关于怎么攻克的文章之前看到的不多,这篇提供了一个思路。作者:fantlam来源:http://www.linuxsight.com/blog/956571 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况...

weixin_28950403的博客 371

【数据分析/商业分析】面试题整理——SQL专题

数据分析\商业分析—面试题整理 自己总结的SQL类的面试题 文章目录数据分析\商业分析—面试题整理1.新增用户2.活跃用户数量3.连续登录4.次(n)日留存5.每个科目下分数最高的两名学生

awater_17的博客 1859

python手势识别滑动ppt_Python实现图片滑动式验证识别方法

1 abstract验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是“滑动拼图式”2 内容概述关于滑动式验证,最早由国内某网络安全公司首次提出的行为式验证,以滑动拼图解锁的方式呈现在世人面前。然后大概过了好几年之后,各种各样的滑动式验证产品都出...

weixin_39696197的博客 470

LD分析实战:基于Plink和R的连锁不平衡计算与可视化全流程

本文详细介绍了基于Plink和R的连锁不平衡(LD)分析全流程,包括基因型数据预处理、LD计算参数设置及结果可视化技巧。通过实战案例解析PLINK文件格式转换、r²值计算关键参数,并展示如何使用ggplot2绘制高质量LD热图,帮助研究人员高效完成基因组关联分析。

weixin_29074295的博客 320

ArcGIS新手必看:5分钟搞定等高线转DEM栅格(附完整操作截图)

本文详细介绍了在ArcGIS中将等高线转换为DEM栅格的完整流程,包括CAD数据预处理、TIN转栅格和直接插值法两种核心方法,以及常见问题排查与优化技巧。通过实战案例和操作截图,帮助GIS新手快速掌握这一测绘数据处理的核心技能,提升地形分析和三维可视化效率。

dapp9builder的博客 287

云机器人图像传输为何不能直接用JPEG?SEAOTTER解决方案

JPEG是一种面向人眼感知的通用图像压缩标准,其基于DCT变换与固定量化表的设计,在语义保真度、时间空间元数据支持及嵌入式资源适配性三方面存在天然局限。在机器人视觉任务中,SLAM建图依赖精确边缘梯度,目标检测要求纹理对比度稳定,而传统JPEG因高频信息压制和元数据缺失,导致特征点匹配率下降、多传感器时间对齐失败、边缘检测准确率跌至61%。SEAOTTER作为ROS2原生优化的语义增强JPEG方言,通过动态量化表引擎、ROS元数据融合编码器与分层解码调度器,实现任务驱动的按需压缩,在Jetson平台将单帧处

weixin_30357231的博客 294

机器人视觉仿真软件:PCL (Point Cloud Library)_(8).点云分割技术

点云分割技术在机器人视觉处理中起着至关重要的作用,通过不同的分割方法可以有效地将点云数据中的不同物体或区域分离出来。PCL提供了丰富的分割算法,包括基于平面的分割、基于聚类的分割、基于模型的分割和基于条件的分割等。每种方法都有其适用的场景和优缺点,选择合适的方法可以显著提高点云处理的效率和准确性。希望本节的内容能够帮助读者更好地理解和应用点云分割技术。

kkchenjj的博客 822

工业AI视觉系统C++后端架构:从模块化设计到Qt Quick集成实践

在工业软件与嵌入式系统开发中,C++因其对性能、内存和硬件的精确控制而成为构建核心业务逻辑的首选语言。其核心原理在于通过零成本抽象、RAII(资源获取即初始化)和强类型系统,在编译期消除大量错误,并确保运行时效率与资源安全。这一技术价值在需要高实时性、高稳定性的场景中尤为突出,例如工业视觉检测、自动化控制等。现代C++结合模块化设计(如分层架构、依赖注入)和跨线程通信机制,能够构建出既高效又易于维护的系统骨架。具体到工业AI视觉项目,C++后端需要与Qt Quick前端高效交互,并集成OpenCV、ONNX

weixin_33691700的博客 358

会计引擎:交易与核算分离的前世今生

一、为什么需要会计引擎 金融产品的设计,一如一块硬币需要兼顾两面:一面是为客户提供好的金融服务,满足客户支付结算、借贷、资产保值增值等方面的需求,并在这个过程中,以数字化的方式做好客户资产的登记,登记的载体,则是“分户”或“台账”,如客户存款户,是一种典型的分户--资金的增减变化都在一个账户中进行体现,而客户购买的银行理财,因为收益率、期限、投资标的不同,每一笔持有就形成一行记录,即为“台账”--这当然是不严谨但相对形象的表述。但是,“分户”和“台账”并没有必然的区别,以贷款为例,一些银行仍然存在所谓“

银行信息系统应用架构详解 985

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

有数据的地方就有存储, 内存是谁都离不开的产品。而动态随机存取存储器(DRAM)作为一种常见的内存。本博客将介绍DRAM的基本概念、工作原理、优缺点以及应用领域等方面。

串起点滴 3920

自动化:Python、windows、安卓、网页、rpa、autojs、firerpa(抓包逆向ai)

通过VS安装一步到位更省事。如果这个环境变量是空的,uiautomator 将返回 connect_usb,您需要确保只有一个设备连接到计算机。然后就会自动安装库所需要的设备端程序:uiautomator-server,atx-agent,openstf / minicap,openstf / minitouch。因为 run_main 执行的时候,是打印所有用例文件+名称,而通过测试套件 添加 类名称时,执行方式不一样。也可以使用pyautogui库帮助文档的方法,不过本人认为使用上面的方法,更加便利。

freeking101的博客 2万+

【数据集】ERA5(欧洲中期天气预报中心)再分析数据介绍及下载

简介EAR5数据集及下载步骤

WW、forever的博客 1万+

VC++车牌识别实战:从图像处理到系统实现

数字图像处理是计算机视觉的基础技术,其核心原理是通过算法对像素矩阵进行变换,以提取、增强和分析图像中的有用信息。在工程实践中,图像处理技术为车牌识别、人脸检测等应用提供了关键支撑。车牌识别系统通常遵循图像预处理、区域定位、字符分割与识别的经典流程,其中涉及灰度化、边缘检测、模板匹配等关键技术。这些方法在VC++等原生开发环境中能实现高效执行,尤其适合对性能和部署有严格要求的场景,如停车场管理、门禁系统。本文通过一个基于VC++的车牌识别项目,详细解析了如何利用传统图像处理算法实现从像素到车牌的完整流程,并分

weixin_30617737的博客 412

SecOC专题之新鲜值TripCnt

本系列为一步步拆解新鲜值的分发及管理而撰写文章属于原创,根据自身开发经验及理解撰写,若有错误请指出Trip Counter是新鲜值中变化最慢的一个part,并且自增到最大值时,会从头开始翻转计数。Trip Counter需要收发双方都保存,由于其变化较慢,所以不会经常进行同步该值。这就要求开发过程中保证每次对该值的读写必须要正确。

qq_22969363的博客 1156

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

淋巴管分割公式:Frangi滤波与自适应阈值的图像处理流程

图像分割是计算机视觉与医学图像分析中的基础任务,其中管状结构分割因目标细长、背景复杂而充满挑战。Frangi滤波作为经典的多尺度管状结构增强算法,通过Hessian矩阵特征值区分管状与块状区域,常与对比度归一化、自适应阈值及形态学清理结合,形成稳定的分割流程。这种组合不仅适用于淋巴管显微图像,也可迁移至血管、神经纤维等线性结构分析。scikit-image 提供了Frangi、Otsu等高效实现,配合CLAHE局部对比度增强,可在复杂背景下保留细小管腔。本文详细拆解了从灰度归一化、多尺度增强到二值掩膜生成的

weixin_34072637的博客 692

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: OpenCV4(9)-色彩空间的转换及应用(C++,Python,JS)
下一篇: OpenCV4.0入门(11)像素归一化
Apple_Coco
博客等级 码龄9年 325粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Apple_Coco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值