灰度图L0最小梯度平滑opencv+C++代码

[C++/OpenCV] 数字图像处理:使用OpenCV实现基于L0范数的梯度最小化图像平滑滤波及完整源代码 本文使用C++语言和OpenCV实现基于L0范数的梯度最小化图像平滑滤波,具体原理请参考文献: "Image Smoothing via L0 Gradient Minimization", Li Xu, Cewu Lu, Yi Xu, Jiaya Jia, ACM Transactions on Graphics,(SIGGRAPH Asia 2011), 2011. 文中提供了MATLA... 阅读详情

Matlab代码:​​​​​​http://t.csdn.cn/vX6Hj​​​​​​

对上述文章中的“代码一”进行C++转换

本文C++代码只针对灰度图像,且只进行了暴力转换,尚未对算法速度进行优化,还望各位大佬手下留情,如有需要可留言

代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

//Matlab中psf2otf()函数
Mat psf2otf(const cv::Mat& psf, const cv::Size& outSize)
{
	Mat otf;

	if (countNonZero(psf) && !psf.empty())
	{
		Size psfSize = psf.size();

		Size paddSize = outSize - psfSize;

		copyMakeBorder(psf, otf, 0, paddSize.height,
			0, paddSize.width,
			BORDER_CONSTANT, Scalar(0));
		dft(otf, otf, DFT_COMPLEX_OUTPUT);
		
		//计算psf的元素个数
		int nElem = psf.cols * psf.rows;

		double nOps = 0;

		int nfft = nElem / psfSize.width;
		nOps += nfft + psfSize.width * log2(psfSize.width) * nfft;
		nfft = nElem / psfSize.height;
		nOps += nfft + psfSize.height * log2(psfSize.height) * nfft;
		//将复数otf分解成实部real和虚部imagin
		Mat planes[2];
		split(otf, planes);

		double max1, min1;
		cv::minMaxIdx(abs(planes[1]), &min1, &max1);
		//double imagin_max = mymax(abs(planes[1]));
		double imagin_max = max1;

		double max2, min2;
		cv::minMaxIdx(abs(otf), &min2, &max2);
		//double mag_max = mymax(myMagnitude(otf));
		double mag_max = max2;

		double eps = nOps * pow(2, -52);
		if ((imagin_max / mag_max) < eps)
			return planes[0];
	}
	return otf;
}
//Matlab中diff()函数
Mat diff(Mat& src, int a, int b)
{
	if (b == 2)//列数(宽)减少
	{
		Mat dst = Mat::zeros(Size(src.cols - 1, src.rows), src.type());
		for (int i = 0; i < dst.rows; i++)
		{
			double* p = src.ptr<double>(i);
			double* d = dst.ptr<double>(i);
			for (int j = 0; j < dst.cols; j++)
			{
				d[j] = (p[j + 1] - p[j]);
			}
		}
		return dst;	
	}
	else
	{
		Mat dst = Mat::zeros(Size(src.cols, src.rows - 1), src.type());
		for (int i = 0; i < dst.rows; i++)
		{
			double* p = src.ptr<double>(i);
			double* p_down = src.ptr<double>(i + 1);
			double* d = dst.ptr<double>(i);
			for (int j = 0; j < dst.cols; j++)
			{
				d[j] = (p_down[j] - p[j]);
			}
		}
		return dst;
	}
}
//L0梯度最小平滑
void L0(Mat& t_Im, float t_lambda, float t_kappa)
{
	double lambda = (double)t_lambda;
	double kappa = (double)t_kappa;

	//S = im2double(Im);
	Mat S;
	t_Im.convertTo(S, CV_64FC1, 1.0 / 255.0);

	//betamax = 1e5;
	double betamax = 1e5;
	/*
	* fx = [-1, 1];
	* fy = [-1; 1];
	* [N,M,D] = size(Im);
	* sizeI2D = [N,M];
	* otfFx = psf2otf(fx,sizeI2D);
	* otfFy = psf2otf(fy,sizeI2D);
	*/
	Mat fx = (Mat_<double>(1, 2) << 1, -1);
	Mat fy = (Mat_<double>(2, 1) << 1, -1);
	Mat otfFx = psf2otf(fx, t_Im.size());
	Mat otfFy = psf2otf(fy, t_Im.size());

	//Normin1 = fft2(S);
	Mat Normin1;
	dft(S, Normin1, DFT_COMPLEX_OUTPUT);

	//Denormin2 = abs(otfFx).^2 + abs(otfFy ).^2;
	Mat Denormin2(t_Im.rows, t_Im.cols, CV_64FC1);
	for (int i = 0; i < t_Im.rows; i++)
	{
		double* d = Denormin2.ptr<double>(i);
		for (int j = 0; j < t_Im.cols; j++)
		{
			Vec2d& c1 = otfFx.at<Vec2d>(i, j);
			Vec2d& c2 = otfFy.at<Vec2d>(i, j);
			// 0: Real, 1: Image
			d[j] = pow(c1[0], 2) + pow(c1[1], 2) + pow(c2[0], 2) + pow(c2[1], 2);
		}
	}

	//beta = 2*lambda;
	double beta = 2.0 * lambda;

	while (beta < betamax)
	{
		// Denormin   = 1 + beta*Denormin2;
		Mat Denormin = 1.0 + beta * Denormin2;

		// h-v subproblem
		
		//diff(S,1,2)
		Mat diffS12 = diff(S, 1, 2);
		/*
		* matlab中S(:, 1, : ), S中的第一列数据
		* matlab中S(:, end, : ), S中的最后一列数据
		*/
		Mat S01 = S.colRange(0, 1);
		Mat S0end = S.colRange(S.cols - 1, S.cols);
		/*
		* h = [diff(S,1,2), S(:,1,:) - S(:,end,:)];
		*/
		Mat Scol = S01 - S0end;
		Mat h = Mat::zeros(S.size(), CV_64FC1);
		for (int i = 0; i < S.rows; i++)
		{
			double* p = diffS12.ptr<double>(i);
			double* sp = Scol.ptr<double>(i);
			double* d = h.ptr<double>(i);
			for (int j = 0; j < S.cols; j++)
			{
				if (j < diffS12.cols)
				{
					d[j] = p[j];
				}
				else
				{
					d[j] = sp[0];
				}
			}
		}

		//diff(S,1,1)
		Mat diffS11 = diff(S, 1, 1);
		/*
		* matlab中S(1, :, : ), S中的第一行数据
		* matlab中S(end, :, : ), S中的最后一行数据
		*/
		Mat S10 = S.rowRange(0, 1);
		Mat Send0 = S.rowRange(S.rows - 1, S.rows);
		/*
		* v = [diff(S,1,1); S(1,:,:) - S(end,:,:)];
		*/
		Mat Srow = S10 - Send0;
		Mat v = Mat::zeros(S.size(), CV_64FC1);
		for (int i = 0; i < S.rows; i++)
		{
			if (i < diffS11.rows)
			{
				double* p = diffS11.ptr<double>(i);
				double* d = v.ptr<double>(i);
				for (int j = 0; j < S.cols; j++)
				{
					d[j] = p[j];
				}
			}
			else
			{
				double* sp = Srow.ptr<double>(0);
				double* d = v.ptr<double>(i);
				for (int j = 0; j < S.cols; j++)
				{
					d[j] = sp[j];
				}
			}
		}
		/*
		* matlab中:
	    *   if D==1
				t = (h.^2+v.^2)<lambda/beta;
			else
				t = sum((h.^2+v.^2),3)<lambda/beta;
				t = repmat(t,[1,1,D]);
			end
			h(t)=0; v(t)=0;
		*/
		for (int i = 0; i < S.rows; i++)
		{
			double* ht = h.ptr<double>(i);
			double* vt = v.ptr<double>(i);
			for (int j = 0; j < S.cols; j++)
			{
				// (∂S/∂x)^2 + (∂S/∂y)^2			
				double val = pow(ht[j], 2) + pow(vt[j], 2);
				// (∂S/∂x)^2 + (∂S/∂y)^2  < λ/β
				if (val < lambda / beta) {
					ht[j] = 0.0;
					vt[j] = 0.0;
				}
			}
		}
		// S subproblem

		//Normin2 = [h(:,end,:) - h(:, 1,:), -diff(h,1,2)];
		Mat diffh12 = diff(h, 1, 2);
		/*
		* matlab中h(:, 1,:), h中的第一列数据
		* matlab中h(:,end,:), h中的最后一列数据
		*/
		Mat h0end = h.colRange(h.cols - 1, h.cols);
		Mat h01 = h.colRange(0, 1);
		Mat hcol = h0end - h01;
		Mat Normin21 = Mat::zeros(S.size(), CV_64FC1);
		for (int i = 0; i < S.rows; i++)
		{
			double* p = diffh12.ptr<double>(i);
			double* sp = hcol.ptr<double>(i);
			double* d = Normin21.ptr<double>(i);
			for (int j = 0; j < S.cols; j++)
			{
				if (j == 0)
				{
					d[j] = sp[0];
				}
				else
				{
					d[j] = -p[j - 1];
				}
			}
		}
		//Normin2 = Normin2 + [v(end,:,:) - v(1, :,:); -diff(v,1,1)];
		/*
		* matlab中v(1, :,:), v中的第一行数据
		* matlab中v(end,:,:), v中的最后一行数据
		*/
		Mat diffv11 = diff(v, 1, 1);

		Mat v10 = v.rowRange(0, 1);
		Mat vend0 = v.rowRange(v.rows - 1, v.rows);
		Mat vrow = vend0 - v10;
		Mat Normin22 = Mat::zeros(S.size(), CV_64FC1);
		for (int i = 0; i < S.rows; i++)
		{
			if (i == 0)
			{
				double* sp = vrow.ptr<double>(0);
				double* d = Normin22.ptr<double>(i);
				for (int j = 0; j < S.cols; j++)
				{
					d[j] = sp[j];
				}
			}
			else
			{
				double* p = diffv11.ptr<double>(i - 1);
				double* d = Normin22.ptr<double>(i);
				for (int j = 0; j < S.cols; j++)
				{
					d[j] = -p[j];
				}
			}
		}
		Mat Normin2 = Normin21 + Normin22;

		//fft2(Normin2)
		Mat fft2Normin2;
		dft(Normin2, fft2Normin2, DFT_COMPLEX_OUTPUT);

		//FS = (Normin1 + beta*fft2(Normin2))./Denormin;
		Mat FS = Normin1 + beta * fft2Normin2;
		for (int i = 0; i < S.rows; i++)
		{
			double* p = Denormin.ptr<double>(i);
			for (int j = 0; j < S.cols; j++)
			{
				FS.at<Vec2d>(i, j)[0] /= p[j];
		     	FS.at<Vec2d>(i, j)[1] /= p[j];
			}
		}
		//ifft2(FS)
		Mat ifft;
		idft(FS, ifft, cv::DFT_SCALE | cv::DFT_COMPLEX_OUTPUT);
		for (int i = 0; i < S.rows; i++)
		{
			double* p = S.ptr<double>(i);
			for (int j = 0; j < S.cols; j++)
			{
				//S = real(ifft2(FS));
				p[j] = ifft.at<cv::Vec2d>(i, j)[0];
			}
		}
		//beta = beta*kappa;
		beta = beta * kappa;
	}
	//显示图片
	normalize(S, S, 0, 255, NORM_MINMAX);
	S.convertTo(S, CV_8UC1);
	resize(S, S, Size(S.cols / 1, S.rows / 1));
	imshow("S", S);
}
int main()
{
    Mat src = imread("C:\\Users\\DELL\\Desktop\\Lena.jpg", 0);
    L0(src,0.02,2.0);
	waitKey(0);
	return 0;
}

选取Lena图像,原图、Matlab与C++结果图分别如下:

原图:

 Matlab的L0梯度最小平滑结果图:

  C++的L0梯度最小平滑结果图:

OpenCV C++实现亚像素级棋盘格角点提取:从原理到工程实践 在计算机视觉和工业检测领域,图像特征点的定位精度是决定整个系统性能的关键。传统像素级坐标受限于图像传感器的最小单元,难以满足高精度测量需求。亚像素定位技术应运而生,其核心原理是利用像素邻域的灰度或梯度信息,通过数学模型(如灰度矩法、插值法)将特征点位置估计精度提升至像素内部。这项技术的价值在于突破了物理分辨率的限制,为相机标定、三维重建和视觉引导等应用提供了微米级甚至更高的测量基础。尤其在机器视觉、工业自动化场景中,对棋盘格、圆点等标定板特征进行亚像素级提取,是提升标定精度和系统稳定性的核心步骤。本文以Op 阅读详情

相关推荐

C++与OpenCV实现工业视觉卡尺工具:亚像素直线边缘检测与测量

在机器视觉与工业自动化领域,边缘检测是图像处理的基础技术,其核心原理是通过分析图像灰度变化来识别物体轮廓。亚像素定位技术在此基础上,将边缘定位精度提升至像素级别以下,是实现高精度尺寸测量的关键。这项技术的工程价值在于,它能将算法原理封装为稳定、易用的交互工具,直接服务于工业质检、精密测量等场景。本文聚焦于卡尺工具的实现,它通过局部采样和灰度分析,在用户定义的区域内精准定位直线边缘,并结合了高斯模糊、灰度梯度法和最小二乘法拟合等核心算法,最终输出亚像素精度的测量结果。对于从事OpenCV开发、C++工程实践或

weixin_33835103的博客 534

L0梯度最小化和非局部精炼的两阶段图像去噪

提出了一种有效的两阶段非盲去模糊框架,用于恢复模糊图像。 逐步。 迄今为止,大多数方法通常都解决单个变数正则化问题与选定的先验相结合,限制了获得的修复质量。 为了解决这个问题,有两个不同的先验条件在不同的阶段采用,以从粗到细的方式恢复图像,并且每个阶段都遵循变化正则化方案。 在第一阶段,通过最大程度地减少锯齿产生明显的边缘和大范围的纹理。 0梯度范数。 然后在下一阶段通过非局部自动回归模型对中间结果进行细化。 最后,实验结果表明,所提出的方法是有效的,并且取得了很好的效果。 表现。

OpenCV C++实战:基于霍夫变换与最小二乘法的直线检测与精确测量

在计算机视觉与图像处理领域,从图像中提取几何特征并进行定量分析是一项基础且关键的技术。其核心原理在于将图像从像素空间转换到特征空间,从而识别出特定的形状模式,例如直线。霍夫变换(Hough Transform)是实现这一目标的经典算法,它通过参数空间投票机制,能够鲁棒地检测出图像中的直线,即使存在部分遮挡或噪声。渐进概率霍夫变换(HoughLinesP)作为其高效变种,直接输出线段端点,极大方便了后续处理。这项技术的工程价值在于,它将抽象的图像像素转化为可计算的几何实体,为精确测量奠定了基础。在实际应用中,

weixin_30608503的博客 400

图象的平滑处理·L0smooth·matlab·GUI界面展示

http://www.cse.cuhk.edu.hk/leojia/papers/L0smooth_Siggraph_Asia2011.pdf 可以参考以上链接,介绍较为详细。而本文章注重的是代码的编写和gui界面的制作,可供小伙伴借鉴交流~ 目录 实验目的 实验内容 无GUI界面 有GUI界面(个人原创、易上手) 数据处理方法 实验代码 原始代码 无GUI界面代码,可调参数,四张图 有GUI界面图代码 关键环节 实验目的 掌握平滑滤波高斯滤波的原理、...

m0_49214701的博客 1314

OpenCV霍夫检测实战:直线与圆检测原理、参数调优与C++实现

霍夫变换是计算机视觉中经典的图像特征检测算法,其核心原理是将图像空间中的像素点映射到参数空间进行投票统计,从而识别出特定的几何形状,如直线和圆。该技术通过将复杂的形状检测问题转化为参数空间的峰值寻找问题,具有原理直观、实现稳定的特点,在工程实践中展现出强大的鲁棒性。其技术价值在于能够从噪声图像中稳定地提取几何特征,为高层视觉任务提供基础。在应用场景上,霍夫检测广泛应用于工业视觉中的零件定位、文档扫描的表格线提取、自动驾驶的车道线识别等实际项目。本文聚焦于OpenCV环境下的霍夫检测实战,深入解析直线检测与圆

weixin_33695450的博客 452

OpenCV C++轮廓比对实战:工业视觉缺陷检测系统开发指南

在计算机视觉领域,图像处理是连接数字世界与物理世界的核心技术,其核心原理在于通过算法对图像进行分析、理解和操作。这项技术的核心价值在于替代人眼,实现自动化、高精度的检测与识别,广泛应用于工业自动化、质量控制和智能安防等场景。其中,轮廓检测作为图像处理的基础技术,通过提取目标的边缘信息来描述其形状特征,是实现物体识别与测量的关键步骤。在工业视觉缺陷检测中,轮廓比对技术因其高效、稳定和对硬件要求低的特点,成为检测形状固定产品(如注塑件、PCB板)表面缺损、毛刺等缺陷的优选方案。本文聚焦于使用OpenCV C++

weixin_34375251的博客 387

MATLAB--图像空间尺度变换以及灰度梯度尺度变换

第一部分的实验实现灰度图像的空间尺度缩放,首先调用T31f1函数把图片缩小,每次长宽均缩小一半,处理三次;最后调用T31f2函数把图片放大,每次长宽均放大一倍,处理三次。第二部分实验通过代码编写实现灰度阶的尺度变换,调用T32f1函数将默认的8比特变换为7比特,再变换为6比特,以此类推变换之1比特,再使用subplot (2,4,i)函数划分2*4的子图,输出图像。subplot是将多个图画到一个平面上的工具。

码银的博客 1419

OpenCV轮廓检测实战:从原理到C++实现完整流程与参数调优

轮廓检测是计算机视觉中图像分割与形状分析的基础技术,其核心原理是通过边缘检测算法(如Canny算子)识别图像中像素强度突变的区域,从而勾勒出物体的边界。这项技术的价值在于能将原始的像素矩阵转化为结构化的几何信息,为后续的物体识别、测量与分类提供关键输入。在工程实践中,轮廓检测广泛应用于工业自动化(如零件尺寸检测)、医疗影像分析(细胞形态识别)以及自动驾驶(道路标识提取)等场景。本文以C++和OpenCV为工具,深入剖析了`findContours`函数的关键参数(如轮廓检索模式RETR_TREE和轮廓近似方

weixin_34245749的博客 455

Sobel算子原理与C/C++实现:从图像梯度到边缘检测实战

在计算机视觉和数字图像处理中,边缘检测是识别图像中物体轮廓和结构的基础技术。其核心原理在于计算图像像素值的局部变化率,即图像梯度。通过卷积运算,可以高效地近似计算图像在水平和垂直方向上的偏导数,从而定位出像素值发生剧烈变化的边缘区域。这一技术对于特征提取、目标识别和场景理解等高级视觉任务具有重要价值,广泛应用于自动驾驶、工业检测和医学影像分析等领域。Sobel算子作为经典的边缘检测工具,通过特定的卷积核设计,在计算效率和抗噪性之间取得了良好平衡。本文以Sobel算子为例,深入剖析其数学推导,并提供了完整的C

weixin_33794672的博客 309

OpenCV MSER算法实战:从原理到文本检测的完整C++实现

在计算机视觉领域,特征检测是识别和理解图像内容的基础技术之一。其核心原理在于从图像中提取具有独特属性的关键点或区域,这些特征应具备尺度、旋转和光照不变性,以实现鲁棒的图像匹配与识别。MSER(最大稳定极值区域)算法作为一种经典的区域检测器,通过模拟水位变化,寻找在灰度阈值连续变化时面积保持稳定的连通区域,从而有效捕捉图像中内部均匀、边界对比强烈的结构。这一技术价值在于其能够稳定检测非刚性、形状多变的区域,如文本、斑点或特定物体,弥补了角点检测和边缘检测在应对低对比度、模糊边界场景时的不足。在工程实践中,结合

java天气 308

C++与OpenCV实现实时人物轮廓提取:传统图像处理实战指南

轮廓提取是计算机视觉的基础任务,其核心原理在于通过图像处理技术识别并勾勒出目标的边界。传统方法通常基于边缘检测、阈值分割和连通域分析,通过分析像素间的梯度、亮度差异来定位轮廓。相较于深度学习方案,传统图像处理技术以其轻量、高效、不依赖GPU算力的特点,在嵌入式设备和实时系统中具有独特的工程价值。它广泛应用于安防监控、互动媒体、视频编辑等需要快速响应和低功耗的场景。本文聚焦于使用C++和OpenCV库,深入探讨如何通过背景减除、Canny边缘检测、轮廓查找与筛选等核心步骤,构建一个稳定、高效的人物轮廓提取模块

weixin_34014555的博客 306

计算机视觉——OpenCV 使用分水岭算法进行图像分割

分水岭算法通过模拟自然地形来实现图像中物体的分类。在这一过程中,每个像素的灰度值被视作其高度,灰度值较高的像素形成山脊,即分水岭,而二值化阈值则相当于水平面,低于这个水平面的区域会被“淹没”。

知来者逆的博客 3541

图像归一化原理与C++ OpenCV实战:从最值归一化到Z-Score标准化

在计算机视觉与机器学习中,数据预处理是模型性能的基石。图像归一化作为核心预处理技术,旨在解决原始像素数据因光照、设备差异导致的尺度不一问题。其核心原理是通过数学变换将数据映射到统一区间,消除量纲影响,使模型专注于本质特征。从技术价值看,归一化能显著提升模型训练稳定性,加速梯度下降收敛,并增强模型泛化能力。常见的实现方法包括最值归一化(Min-Max Scaling)和Z-Score标准化,前者通过线性缩放将数据映射到固定区间,但对异常值敏感;后者基于均值和标准差进行中心化与缩放,对异常值更鲁棒,更符合深度学

weixin_30666401的博客 462

OpenCV3之——边缘检测Canny算子的高阶用法

一、canny算子:               Canny的目标是找到一个最优的边缘检测算法,评判标准:低错误率、高定位性、最小响应 二、canny边缘检测的步骤: 消除噪声,一般情况下,使用高斯平滑滤波器卷积降噪 计算梯度幅值和方向 非极大值抑制,这一步排除非边缘像素,仅仅保留了一些细线条(候选边缘) 滞后阈值                &lt;1&gt;若某一像素位置的幅值超...

衣带渐宽人憔悴 2162

ORB特征提取算法:原理、C++实现与OpenCV实战调优

在计算机视觉领域,特征提取是图像匹配、目标识别和三维重建等任务的基础。其核心原理在于从图像中检测并描述具有显著性和不变性的关键点,以便在不同视角或条件下进行稳定匹配。传统算法如SIFT虽性能优异但计算量大,难以满足实时性要求。ORB(Oriented FAST and Rotated BRIEF)算法应运而生,它通过改进的oFAST检测器实现快速角点定位与方向计算,并结合具有旋转不变性的rBRIEF二进制描述子,在速度和性能间取得了卓越平衡。该技术对于**嵌入式设备**和**移动端实时应用**(如SLAM、

413

ITK:计算灰度图像的梯度幅度

ITK:计算灰度图像的梯度幅度内容提要输出结果C++实现代码 内容提要 本示例演示了如何计算图像梯度的大小。 输出结果 C++实现代码 #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkGradientMagnitudeImageFilter.h" int main(int argc, char * argv[]) { // Verify command

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1014

OpenCV C++实战:基于轮廓分析的物体面积测量与物理标定

在计算机视觉与图像处理领域,物体尺寸测量是一项基础且关键的技术。其核心原理在于通过图像分割、边缘检测等方法,将图像中的像素信息转化为可量化的几何参数。这项技术的价值在于为自动化质检、生物医学分析、农业估产等场景提供了非接触、高效率的测量手段。传统方法如轮廓分析,因其流程确定、无需训练数据、计算速度快且精度可控,在工业级高实时性应用中展现出独特优势。本文聚焦于使用C++与OpenCV库,详细拆解了从图像预处理、二值化分割、轮廓查找到面积计算与物理标定的完整工程化流程,并深入探讨了性能优化与代码健壮性等实战要点

weixin_30787531的博客 348

[Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图

本篇文章主要讲解灰度直方图的基本概念,Python调用OpenCV实现绘制图像直方图,基础性知识希望对您有所帮助。 1.灰度直方图基本概率 2.绘制直方图 3.使用OpenCV统计绘制直方图

杨秀璋的专栏 2万+
上一篇: 【笔记】opencv4.0+c++无法识别CvFont
下一篇: 【笔记】编译器错误 C2471: 无法更新程序数据库vc142.pdb的解决办法
客官可满意
博客等级 码龄6年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

客官可满意

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

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

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

打赏作者

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

抵扣说明:

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

余额充值