java BufferedImage rgb2hsv

做了个java版的rgb2hsv

/*
 * RGB转HSV
 * 输入范围R,G,B, 0~255
 * 输出范围[0]:0~1,[1]:0~1,[2]:0~255
 */
public static float[] rgb2hsvF(int R, int G, int B){
 
	int tMax, tMin;
	float H=0,S=0,V=0;
	float delta;
	float tRet[] = new float[3];
	tMax=Math.max(R, Math.max(G,B));
	tMin=Math.min(R, Math.min(G,B));
	if(0 == tMax){
		tRet[0] = 0; 
		tRet[1] = 0;
		tRet[2] = 0; 
		return tRet;
	}
	
	V = tMax; 
	delta = tMax - tMin;
 
	S = delta / tMax;    		 
	
	if(0 == delta){
		H = 0;
	}else if(G == tMax ){
		H = 2 + (B - R)  / delta; // between cyan & yellow
	}else if(B == tMax){
		H = 4 + (R - G)  / delta; // between magenta & cyan		
	}else if(R == tMax){
		H =  (G - B) / delta;     // between yellow & magenta
	} 		
	 
	H *= 60; 
	if(H < 0 ){
		H += 360;
	}
	
	tRet[0] = H/360.0f; 
	tRet[1] = S;
	tRet[2] = V; 
	return tRet;
}

/*
 * RGB转HSV图像
 * 注意:HSV的范围都是0~255,H的范围不是0~360,否则显示的就不正常
 */
public static BufferedImage rgb2hsv(final BufferedImage vSrcImg){
	if(null == vSrcImg){
		return null; 
	}
			
	int tWidth = vSrcImg.getWidth();
	int tHeight = vSrcImg.getHeight(); 
 
	BufferedImage tHsvImg = new BufferedImage(tWidth, tHeight, vSrcImg.getType());
	//System.out.println("rgb2hsv, vSrcImg.getType()="+vSrcImg.getType());
	int R,B,G,max, min;
	float H=0,S=0,V=0;
	int delta;
	for(int i=0; i<tWidth; i++){
		for(int j=0; j<tHeight; j++){
			int pixel = vSrcImg.getRGB(i, j);
			R = (pixel & 0xff0000) >> 16;  
			G = (pixel & 0xff00) >> 8;  
			B = (pixel & 0xff);
			float f[] = rgb2hsvF(R, G, B);
			R = (int)(f[0]*255);
			G = (int)(f[1]*255);
			B = (int)(f[2]);
			int pixel_hsv2= (R << 16) | (G << 8) | B;
			tHsvImg.setRGB(i, j, pixel_hsv2);
			if(true){
				continue;
			}
			
//			用下面这段显示的就有问题,不知道哪里错了
//				max=Math.max(R, Math.max(G,B));
//				min=Math.min(R, Math.min(G,B));
//				if(0 == max){
//					tHsvImg.setRGB(i, j, 0);
//					continue; 
//				}
//				
//				V = max; 
//				delta = max - min;				 
//				S = (delta / max);       // s
//				 				
//				if(0 == delta){
//					H = 0;
//				}else if(G == max ){
//					H = 2 + (B - R)  / delta; // between cyan & yellow
//				}else if(B == max){
//					H = 4 + (R - G)  / delta; // between magenta & cyan		
//				}else if(R == max){
//					H =  (G - B) / delta;     // between yellow & magenta
//				}
//				 
//				H *= 60; 
//				if(H < 0){
//					H += 360;
//				}
//				
//				R = (int)(H*255/360);
//				G = (int)(S*255);
//				B = (int)(V); 
//				int pixel_hsv= (R << 16) | (G << 8) | B;
//				tHsvImg.setRGB(i, j, pixel_hsv);
		}
	} 

	return tHsvImg;
}

把lena拿来试一下,跟matlab里面一样





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java BufferedImage类是Java中用于描述图像信息的类,可以用来处理图像的读取、修改和保存。BufferedImage对象可以包含一个图像,并提供访问像素数据的方法。它继承于Image类,并实现了RenderedImage接口。 ### 回答2: BufferedImageJava中处理图像的一个类。我们可以使用这个类来读取、处理、存储和创建图像。 BufferedImage类有很多方法,其中一些是: 1. createImage方法 - 创建一个新的图像。 2. getRGB方法 - 获取一个指定位置的像素点的RGB值。 3. setRGB方法 - 设置一个指定位置的像素点的RGB值。 4. getWidth方法 - 获取图像的宽度。 5. getHeight方法 - 获取图像的高度。 6. getSubimage方法 - 获取图像的一个子图像。 7. createGraphics方法 - 创建一个Graphics2D对象,可以在图像上绘制各种图形。 使用BufferedImage可以对图像进行各种处理,比如缩放、旋、剪裁、颜色换等等。使用BufferedImage需要注意内存的占用,处理大型图像时需要特别小心,以避免内存溢出的情况。 总之,BufferedImageJava中一种非常强大的处理图像的工具,使用它可以很方便地进行各种图像处理操作。 ### 回答3: Java中的BufferedImage是一个用于存储图像数据的类,它是一个继承自Image类的子类。BufferedImage提供了许多用于处理图像数据的方法,包括读、写、绘制和操作像素等操作。 BufferedImage的像素数据存储在内存中,像素数据的存储和读取速度非常快,这使得它成为处理图像的重要工具。在Java中使用BufferedImage可以对图像进行很多操作,如图像的缩放、旋、裁剪、滤波等。 在使用BufferedImage时,可以使用常用的图片格式(如JPEG、PNG等)进行读取,也可以使用像素数组手动创建一个图片。在处理图片时,一般会将图片读取到内存中,然后进行各种操作,最终将结果保存为新的图片。 使用BufferedImage还可以实现图像的位深度提升、颜色换、图像对比度、亮度等调整,还可以进行图像的复制、合并和填充等算法。另外,BufferedImage支持Alpha通道、透明的背景颜色等特性,这在处理特殊的图像时非常有用。 总之,Java中的BufferedImage类是处理图像数据的非常强大的工具,可以帮助我们实现各种各样的图像操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值