数字图像处理,经典对比度增强算法

2023-11-04

关于图像增强必须清楚的基本概念

1.图像增强的目的:

1)改善图像的视觉效果,
2)转换为更适合于人或机器分析处理的形式
3)突出对人或机器分析有意义的信息
4)抑制无用信息,提高图像的使用价值
5)增强后的图像并不一定保真


2,图像增强的方法分类:

1)从处理对象分类:灰度图像,(伪)彩色图像
2)从处理策略分类:全局处理,局部处理(ROI ROI,Region of Interest Interest)
3)从处理方法分类:空间域(点域运算,即灰度变换;邻域方法,即空域滤波),频域方法
4)从处理目的分类:图像锐化,平滑去噪,灰度调整(对比度增强)


3,图像增强的方法之对比度增强

1)灰度变换法

线性变换(已实现)
对数变换(已实现)
指数变换(已实现)

2)直方图调整法
直方图均衡化(已实现)
直方图匹配(未实现)



一,直方图均衡化 

直方图均衡化的英文名称是Histogram Equalization. 

  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
  直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
  缺点: 
  1)变换后图像的灰度级减少,某些细节消失; 
  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。 
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。 
  这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
  这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。
  

关于编程实现,同样是不调用matlab库函数,自己编程实现。这样可以更深刻地理解直方图均衡化技术,提高编程能力。

实现代码(matlab):


clc;
close all;
clear all;
 
src_img = imread('flyman_gray.bmp');  

figure (1) 
subplot(321),imshow(src_img),title('原图像');%显示原始图像  
subplot(322),imhist(src_img),title('原图像直方图');%显示原始图像直方图  

matlab_eq=histeq(src_img);         %利用matlab的函数直方图均衡化
subplot(323),imshow(matlab_eq),title('matlab直方图均衡化原图像');%显示原始图像  
subplot(324),imhist(matlab_eq),title('matlab均衡化后的直方图');%显示原始图像直方图 

dst_img=myHE(src_img);             %利用自己写的函数直方图均衡化
subplot(325),imshow(dst_img),title('手写均衡化效果');%显示原始图像  
subplot(326),imhist(dst_img),title('手写均衡化直方图');%显示原始图像直方图 

直方图均衡化函数的实现:


function dst_img=myHE(src_img)  

[height,width] = size(src_img);
dst_img=uint8(zeros(height,width));
%进行像素灰度统计;    
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级    
for i = 1:height    
    for j = 1: width    
        NumPixel(src_img(i,j) + 1) = NumPixel(src_img(i,j) + 1) + 1;%对应灰度值像素点数量增加一    
    end    
end    
%计算灰度分布密度    
ProbPixel = zeros(1,256);    
for i = 1:256    
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);    
end    
%计算累计直方图分布    
CumuPixel = zeros(1,256);    
for i = 1:256    
    if i == 1    
        CumuPixel(i) = ProbPixel(i);    
    else    
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);    
    end    
end    
  
% 指定范围进行均衡化  
% pixel_max=max(max(I));  
% pixel_min=min(min(I));  
pixel_max=255;  
pixel_min=0;  
%对灰度值进行映射(均衡化)    
for i = 1:height    
    for j = 1: width    
        dst_img(i,j) = CumuPixel(src_img(i,j)+1)*(pixel_max-pixel_min)+pixel_min;    
    end    
end    
return;



为什们和matlab的直方图不一样呢???



二,指数变换

指数变换(Power-Law )的公式:S=c*R^r, 通过合理的选择c和r可以压缩灰度范围,算法以c=1.0/255.0, r=2实现。
要做该图像增强变换需要先做归一化,再指数变换,最后反归一化
增强效果展示:可以看见,改增强算法并不能很好的将像素尽可能的碾平。
指数增强参考程序为:
clc;
close all;
clear all; 
   
% -------------Gamma Transformations-----------------  
%f = imread('Fig0316(4)(bottom_left).tif');   
f = imread('seed.tif');   
Gamma = 0.4;  
g2 = myExpEnhance(f,Gamma);  

figure();  
subplot(221);  imshow(f);  xlabel('a).Original Image');  
subplot(222),imhist(f),title('原图像直方图');%显示原始图像直方图  
subplot(223);  imshow(g2);  xlabel('b).Gamma Transformations \gamma = 0.4');  
subplot(224),imhist(g2),title('增强图像直方图');%显示原始图像直方图 
指数增强核心函数为:
function dst_img=myExpEnhance(src_img,Gamma)  
src_img = mat2gray(src_img,[0 255]);%将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。  
C = 1;  
g2 = C*(src_img.^Gamma); 
%反归一化
max=255;
min=0;
dst_img=uint8(g2*(max-min)+min);


三,对数变换

       对数变换主要用于将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的。变换方法由下式给出。
这里的对数变换,底数为(v+1),实际计算的时候,需要用换底公式。其输入范围为归一化的【0-1】,其输出也为【0-1】。对于不同的底数,其对应的变换曲线如下图所示。
底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。看下面的实验就可以很直观的理解,下图是某图像的二维傅里叶变换图像,其为了使其灰度部分较为明显,一般都会使用灰度变换处理一下。

效果图:
参考代码:
clc;
close all;
clear all; 

%-------------Log Transformations-----------------
f = imread('seed.tif');

g_1 = myLogEnhance(f,10);
g_2 = myLogEnhance(f,100);
g_3 = myLogEnhance(f,200);

figure();
subplot(2,2,1);
imshow(f);xlabel('a).Original Image');

subplot(2,2,2);
imshow(g_1);xlabel('b).Log Transformations v=10');

subplot(2,2,3);
imshow(g_2);xlabel('c).Log Transformations v=100');

subplot(2,2,4);
imshow(g_3);
xlabel('d).Log Transformations v=200');

对数变换核心函数
function dst_img=myLogEnhance(src_img,v) 
c=1.0;
src_img = mat2gray(src_img,[0 255]);
g =c*log2(1 + v*src_img)/log2(v+1);
%反归一化
max=255;
min=0;
dst_img=uint8(g*(max-min)+min);


四,灰度拉伸

灰度拉伸也用于强调图像的某个部分,与伽马变换与对数变换不同的是,灰度拉升可以改善图像的动态范围。可以将原来低对比度的图像拉伸为高对比度图像。实现灰度拉升的方法很多,其中最简单的一种就是线性拉伸。而这里介绍的方法稍微复杂一些。灰度拉伸所用数学式如下所示。
同样的,其输入r为【0-1】,其输出s也为【0-1】。这个式子再熟悉不过了,跟巴特沃斯高通滤波器像极了,其输入输出关系也大致能猜到是个什么形状的。但是,这里就出现一个问题了,输入为0时候,式子无意义了。所以,在用Matlab计算的时候,将其变为如下形式。
这里的eps,就是Matlab里面,一个很小数。如此做的话,式子变得有意义了。但是,其输入范围为【0-1】的时候,其输出范围变为了。输出范围大致为【0-1】,为了精确起见,使用mat2gray函数将其归一化到精确的[0-1]。调用格式如下。

五,线性拉伸

为了突出感兴趣的目标或者灰度区间,相对抑制那些不感兴趣的灰度区域,可采用分段线性法,常用的是三段线性变换
参考程序:
clc;
close all;
clear all; 

I=imread('seed.tif'); 
[m,n,k]=size(I);
figure (1)
imshow('seed.tif');title(' 原图像'); 
mid=mean(mean(I));
%横轴
fa=20; fb=80;
%纵轴
ga=50; gb=230;

J=myLinearEnhance(I,fa,fb,ga,gb);
figure (2)
imshow(J);title(' 线性拉伸图像'); 

pixel_f=1:256;
pixel_g=zeros(1,256);

%三段斜率,小于1表示该段将会被收缩
k1=double(ga/fa); 
k2=(gb- ga)/(fb- fa);
k3=(256- gb)/(256- fb);
for i=1:256
    if i <= fa
        pixel_g(i)= k1*i;
    elseif fa < i && i <= fb
        pixel_g(i)= k2*( i- fa)+ ga;
    else
        pixel_g(i)= k3*( i - fb)+ gb;
    end
end
figure (3)
plot(pixel_f,pixel_g);


核心函数:
function dst_img=myLinearEnhance(src_img,fa,fb,ga,gb)  

[height,width] = size(src_img);
dst_img=uint8(zeros(height,width));

src_img=double(src_img);

%三段斜率
k1=ga/fa; 
k2=(gb- ga)/(fb- fa);
k3=(255- gb)/(255- fb);
for i=1:height
    for j=1:width
            if src_img(i,j) <= fa
                dst_img(i,j)= k1*src_img(i,j);
            elseif fa < src_img(i,j) && src_img(i,j) <= fb
                dst_img(i,j)= k2*( src_img(i,j)- fa)+ ga;
            else
                dst_img(i,j)= k3*( src_img(i,j)- fb)+ gb;
            end
    end
end
dst_img=uint8(dst_img); 


附录:

附录网上的另一份讲解:
直方图均衡化算法分为三个步骤,第一步是统计直方图每个灰度级出现的次数,第二步是累计归一化的直方图,第三步是计算新的像素值。
第一步:
for(i=0;i<height;i++)
for(j=0;j<width;j++)
n[s[i][j]]++;

for(i=0;i<L;i++)
p[i]=n[i]/(width*height);

这里,n[i]表示的是灰度级为i的像素的个数,L表示的是最大灰度级,width和height分别表示的是原始图像的宽度和高度,所以,p[i]表示的就是灰度级为i的像素在整幅图像中出现的概率(其实就是p[]这个数组存储的就是这幅图像的归一化之后的直方图)。
第二步:
for(i=0;i<=L;i++)
for(j=0;j<=i;j++)
c[i]+=p[j];

c[]这个数组存储的就是累计的归一化直方图。
第三步:
max=min=s[0][0];
for(i=0;i<height;i++)
for(j=0;j<width;j++)
if(max<s[i][j]){
max=s[i][j];
}else if(min>s[i][j]){
min=s[i][j];
}

找出像素的最大值和最小值。
for(i=0;i<height;i++)
for(j=0;j<width;j++)
t[i][j]=c[s[i][j]]*(max-min)+min;

t[][]就是最终直方图均衡化之后的结果。


收录优秀代码:

这份代码写得不错,学习了,原博客地址见参考资源【3】!

#include <stdio.h>
#include <iostream>
#include "fftw3.h"
#include "string"
#include "vector"
#include <windows.h>
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/nonfree/nonfree.hpp>//opencv_nonfree模块:包含一些拥有专利的算法,如SIFT、SURF函数源码。 
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/nonfree/features2d.hpp>

using namespace cv;
using namespace std;

class hisEqt
{
public:
	hisEqt::hisEqt();
	hisEqt::~hisEqt();
public:
	int w;
	int h;
	int nlen;

	int *pHis;
	float *pdf;

	//=====求像素分布概率密度====  
	void  getPdf();

	//======统计像素个数=======  
	void getHis(unsigned char*imgdata);

	//==========画统计分布直方图===============  
	void drawHistogram(const float*pdf,Mat &hist1);  

	//===========直方图均衡化==========  
	void hisBal();

	//====直方图均衡化后的图像===  
	void imgBal(unsigned char* img);
};


hisEqt::hisEqt() :nlen(0){
	pHis = new int[256 * sizeof(int)];
	memset(pHis, 0, 256 * sizeof(int));
	pdf = new float[255 * sizeof(float)];
	memset(pdf, 0, 255 * sizeof(float));
}

hisEqt::~hisEqt(){
	delete[]pHis;
	delete[]pdf;
}


//======统计像素个数=======  
void hisEqt::getHis(unsigned char*imgdata){
	for (int i = 0; i<nlen; i++)
	{
		pHis[imgdata[i]]++;
	}
}


//=====求像素分布概率密度====  
void hisEqt::getPdf(){
	for (int k = 0; k<256; k++)
	{
		pdf[k] = pHis[k] / float(nlen);
	}
}

//===========直方图均衡化==========  
void hisEqt::hisBal(){
	for (int k = 1; k<256; k++)
	{
		pdf[k] += pdf[k - 1];
	}
	for (int k = 0; k<256; k++)
	{
		pHis[k] = 255 * pdf[k];
	}
}

//====直方图均衡化  
void hisEqt::imgBal(unsigned char* img){
	for (int i = 0; i<nlen; i++)
	{
		img[i] = pHis[img[i]];
	}
}


void hisEqt::drawHistogram(const float *pdf, Mat& hist1){
	for (int k = 0; k<256; k++)
	{
		if (k % 2 == 0)
		{
			Point a(k, 255), b(k, 255 - pdf[k] * 2550);
			line(hist1,
				a,
				b,
				Scalar(0, 0, 255),
				1);
		}
		else
		{
			Point a(k, 255), b(k, 255 - pdf[k] * 2550);
			line(hist1,
				a,
				b,
				Scalar(0, 255, 0),
				1);
		}
	}
}


int main()
{
	Mat image = imread("Fig0651(a)(flower_no_compression).tif");
	if (!image.data)
		return -1;

	Mat hist2(256, 256, CV_8UC3, Scalar(0, 0, 0));
	Mat hist1(256, 256, CV_8UC3, Scalar(0, 0, 0));

	Mat imgOut = Mat(image.rows, image.cols, CV_8UC3, Scalar(0, 0, 0));
	vector<Mat> planes;
	int chn = image.channels();
	if (chn == 3)
	{
		split(image, planes);
	}
	while (chn)
	{
		chn--;
		unsigned char* imageData = new unsigned char[sizeof(unsigned char)*(image.cols*image.rows)];
		memcpy(imageData, planes[chn].data, planes[chn].cols*planes[chn].rows);
		hisEqt his;//自定义的类
		his.nlen = image.rows*image.cols;
		his.getHis(imageData);
		his.getPdf();

		//  //======画原图直方图并保存============  
		his.drawHistogram(his.pdf, hist1);
		string pic_name = "hisline";
		pic_name = pic_name + to_string(chn);
		pic_name=pic_name+	".jpg";
		imwrite(pic_name, hist1);

		his.hisBal();
		his.getPdf();
		//  //======画均衡化后直方图并保存============  
		his.drawHistogram(his.pdf, hist2);
		string pic_name0 = "his_balanceline";
		pic_name0 = pic_name0 + to_string(chn);
		pic_name0 = pic_name0 + ".jpg";
		imwrite(pic_name0, hist2);

		//  //=====图像均衡化===  
		his.imgBal(imageData);
		memcpy(planes[chn].data, imageData, planes[chn].cols*planes[chn].rows);
		delete[] imageData;
		imageData = NULL;
	}
	merge(planes, imgOut);//单通道合并
	imwrite("result.jpg", imgOut);
	return 0;
}



参考资源

【1】http://blog.csdn.net/xiajun07061225/article/details/6910129

【2】数字图像处理,冈萨雷斯著

【3】http://blog.csdn.net/bettyshasha/article/details/46940805

【4】http://blog.csdn.net/terryzero/article/details/6043821

【5】http://www.myexception.cn/image/1450848.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字图像处理,经典对比度增强算法 的相关文章

  • UTF8/UTF16 和 Base64 在编码方面有什么区别

    In c 我们可以使用下面的类来进行编码 System Text Encoding UTF8 System Text Encoding UTF16 System Text Encoding ASCII 为什么没有System Text En
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • Python+uiautomator2手机UI自动化测试实战 --1. 环境搭建

    转自 https blog csdn net ricky yangrui article details 81414870 一 简介 uiautomator2是一个python库 用于Android的UI自动化测试 其底层基于Google
  • Python POST实现发送Ajax的两个坑

    今天给写的应用做测试 服务器单元测试搞定了 要做功能测试和验收测试 功能测试需要模拟Ajax 验收测试需要Selenium 我之前的Selenium都是用Python 一想的话那就都用Pyhton了 结果一上来就掉到了Python的坑里 g
  • 蓝桥杯算法提高VIP-棋盘多项式

    题目 题目链接 题解 DFS 整体思路 横向分块 如下 我们只需要按连通块的序号去深搜即可 对于每个连通块 我们可以选择其中的任何一个空格作为放 車 的位置 或者选择不在这个连通块中放 車 因此 我们的问题转化为在dfs中如何确定连通块 如
  • Java Socket网络编程的经典例子(转)

    事实上网络编程简单的理解就是两台计算机相互通讯数据而已 对于程序员而言 去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了 Java SDK提供一些相对简单的Api来完成这些工作 Socket就是其中之一 对于Java而言 这些Ap
  • go-libp2p中文文档

    GO LIBP2P入门 这是有关使用libp2p的Go实现go libp2p的一系列教程中的第一篇 我们将介绍安装Go 设置新的Go模块 启动libp2p节点以及在它们之间发送ping消息 安装Go go libp2p建议使用包含模块功能的
  • java实现金钱数字转大写

    private static final char ChineseNum 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 private static final char ChineseUnit 里 分 角 元 拾 佰 仟 万 拾 佰 仟 亿 拾
  • Java学习笔记(十五)

    字符串操作 一 Java 中操作字符串都有哪些类 它们之间有什么区别 String StringBuffer StringBuilder String final修饰 是不可变的 所以线程安全 String类的方法都是返回new Strin
  • 刷脸掀起一场新技术变革解决焦虑良药

    对于对手机操作不熟练 特别是不方便拿手机的人而言 刷脸支付简直不能更方便 支付行业一直是红海市场 而随着智能刷脸支付的推广 支付被推向风口 支付行业正迎来一次新的革命 一方面 正是因为市场火热 支付行业的宏观监管日趋严格 新兴的人工智能技术
  • 国内服务器内存缓冲芯片,服务器内存拆芯片用

    服务器内存拆芯片用 内容精选 换一换 本次Ceph集群使用TaiShan服务器部署 三个Ceph节点采用三台为TaiShan 200服务器 型号2280 K8s节点两台均采用TaiShan 200服务器 型号2280 每台服务器配备4个SA
  • 国密SM2非对称加密算法(对本地文件的加解密)代码展示

    代码 package com example demo MIMAXUE SM import java io import java math BigInteger import java security SecureRandom impo
  • springboot 提示The hierarchy of the type ** is inconsistent

    SpringBoot 启动提示 The hierarchy of the type is inconsistent 原因 该类或其父类所在的jar包没有被引入 建议解决方案 从该类的父类开始跟踪源码 找到其所在的jar包并引入项目中 一般是
  • 【学习笔记】使用PicGo+Gitee实现md文档图片上传

    使用PicGo Gitee实现md文档图片上传 本笔记参考于Markdown Typora使用教程 前言 使用md文档进行记录的时候 经常需要在文档中放入图片 由于文档中的图片基本是放到本地的文件夹中 所以当我们需要将文档发给别人或者发布到
  • qt打开html如何使用http服务,Qt通过HTTP POST上传文件(示例代码)

    本文使用Qt Creator用HTTP POST的方法上传文件 并给出一个上传文件的例程 本文主要客户端 所以对于服务器端程序编写的描述会比较简略 服务器使用Django编写 django服务器接收文件的方法在文章http www cnbl
  • crm虚拟服务器搭建,搭建CRM服务器

    1 在windows下安装3 windows installer exe软件 默认安装 手动指定安装位置 比如 d crm 2 访问一下看看是否好用 3 进入d crm 拷贝D crm htdocs文件夹 到linux服务器下的网站默认文件
  • gensim中的word2vec的使用

    本着尊重原著的想法 我们先把一些引用的文章贴上来 供大家参考 word2vec的理论知识 这个真的蛮详细的 我表示没有耐心全部搞透啊 https blog csdn net itplus article details 37969519 苏
  • 【开发工具】 windows10使用adobe傻瓜式教程 真的太爽了吧!!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 其中包含了 你懂的 我不说啦 系统与硬件需求 操作系统 软件版本越高 对电脑系统要求
  • 矩阵篇(三)-- 矩阵的普通乘积、Hadamard 积、Kronecker 积及其性质

    1 普通乘积 matmul product 若 A pmb A AA 是 m n m times n m n 矩阵
  • CSS格式化代码(国内各大网站)

    京东格式化CSS代码 京东格式化CSS代码 把所有标签的默认内外边距清零 margin 0 padding 0 em 和 i 斜体文字不倾斜 em i font style normal 去掉li的小圆点 li list style non
  • hdfs删除和上传文件命令参考

    删除hadfs文件 export HADOOP USER NAME hdfs hadoop fs rm r skipTrash datafs 5gmr parameter neighborhood export HADOOP USER NA
  • 数字图像处理,经典对比度增强算法

    关于图像增强必须清楚的基本概念 1 图像增强的目的 1 改善图像的视觉效果 2 转换为更适合于人或机器分析处理的形式 3 突出对人或机器分析有意义的信息 4 抑制无用信息 提高图像的使用价值 5 增强后的图像并不一定保真 2 图像增强的方法