图像处理之加减乘除

昨天和同学一起去蹭Oracle数据库的课,老师很Nice,学到了两点。第一点B树索引,第二点位图索引。

两种很有用的数据结构,这几天好好研究研究。出乎意料的是:下课老师说我们可以去上机,真好嘿嘿,第二节课英语听力,就没去了。

今天上机(数字图像处理)用java写的图像 加减乘除操作,效果和Matlab的一比很差,不过还是和大家分享下吧!

这是原图:

/*
 * 图像处理
 */
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Image extends JFrame {

	public void ShowImage(String img1, String img2, String img3, String img4, String img5)
	{
		JPanel panel=new JPanel(new BorderLayout());
        JLabel label1=new JLabel(new ImageIcon(img1));
        JLabel label2=new JLabel(new ImageIcon(img2));
        JLabel label3=new JLabel(new ImageIcon(img3));
        JLabel label4=new JLabel(new ImageIcon(img4));
        JLabel label5=new JLabel(new ImageIcon(img5)); 

        panel.add(label1,BorderLayout.WEST);
        panel.add(label2, BorderLayout.EAST);
        panel.add(label3, BorderLayout.SOUTH);
        panel.add(label4, BorderLayout.NORTH);
        panel.add(label5, BorderLayout.CENTER);

        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(panel,BorderLayout.CENTER);  

        this.setSize(1000, 1000);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setTitle("显示图像");
        this.setVisible(true);  

	}

	public static void main(String[] args) throws IOException
	{

		BufferedImage bi1 = ImageIO.read(new File("bg.jpg"));

		BufferedImage bi2 = ImageIO.read(new File("bin.jpg"));

		int h2 = bi2.getHeight();
		int w2 = bi1.getWidth();

		int h=bi1.getHeight();//获取图像的高
		int w=bi1.getWidth();//获取图像的宽

		int rgb=bi1.getRGB(0, 0);//获取指定坐标的ARGB的像素值
		int rgb2 = bi2.getRGB(0, 0);

		int[][] gray=new int[w][h];
		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				gray[x][y]=getGray(bi1.getRGB(x, y));
			}
		}

		/*
		 * 两幅图像求和相加
		 */
		int[][] add = new int[w][h];
		int[][] sub = new int[w][h];
		int[][] mul = new int[w][h];
		int[][] div = new int[w][h];

		for(int x = 0; x < w; ++ x)
		{
			for(int y = 0; y < h; ++ y)
			{
				add[x][y] = (getGray(bi1.getRGB(x, y)) + getGray(bi2.getRGB(x, y)))%256;
				sub[x][y] = (getGray(bi1.getRGB(x, y)) - getGray(bi2.getRGB(x, y)))%256;
				mul[x][y] = (getGray(bi1.getRGB(x, y)) * getGray(bi2.getRGB(x, y)))%256;
				//div[x][y] = (getGray(bi1.getRGB(x, y)) / getGray(bi2.getRGB(x, y)))%256;

			}

		}

		BufferedImage nbi=new BufferedImage(w,h,BufferedImage.TYPE_BYTE_BINARY);
		BufferedImage nbi1=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		BufferedImage nbi2=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		BufferedImage nbi3=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		BufferedImage nbi4=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);

		/*
		 * 二值化
		 */
		int SW=160;
		for (int x = 0; x < w; x++) {
			for (int y = 0; y < h; y++) {
				if(getAverageColor(gray, x, y, w, h)>SW)
				{
					int max=new Color(255,255,255).getRGB();
					nbi.setRGB(x, y, max);
				}else
				{
					int min=new Color(0,0,0).getRGB();
					nbi.setRGB(x, y, min);
				}
			}
		}

		for(int x = 0; x < w; ++ x)
		{
			for(int y = 0; y < h; ++ y)
			{

				nbi1.setRGB(x, y, add[x][y]);
				nbi2.setRGB(x, y, sub[x][y]);
				nbi3.setRGB(x, y, mul[x][y]);
				nbi4.setRGB(x, y, div[x][y]);

			}
		}
		ImageIO.write(nbi, "jpg", new File("./bin.jpg"));
		ImageIO.write(nbi1, "jpg", new File("./add.jpg"));
		ImageIO.write(nbi2, "jpg", new File("./sub.jpg"));
		ImageIO.write(nbi3, "jpg", new File("./mul.jpg"));
		ImageIO.write(nbi4, "jpg", new File("./div.jpg"));

		Image img = new Image();
        img.ShowImage("add.jpg", "sub.jpg", "mul.jpg", "div.jpg", "bin.jpg");

	}

	/*
	 * 每个像素多有Red Green Blue 三原色
	 */
	public static int getGray(int rgb)
	{
		String str=Integer.toHexString(rgb);
		int r=Integer.parseInt(str.substring(2,4),16);
		int g=Integer.parseInt(str.substring(4,6),16);
		int b=Integer.parseInt(str.substring(6,8),16);
		//or 直接new个color对象

		Color c=new Color(rgb);
		r=c.getRed();
	    g=c.getGreen();
		b=c.getBlue();
		int top=(r+g+b)/3;
		return (int)(top);
	}

	/**
	 * 自己加周围8个灰度值再除以9,算出其相对灰度值
	 */
	public static int  getAverageColor(int[][] gray, int x, int y, int w, int h)
    {
		/*
		 * 相加九次取均值
		 */
        int rs = gray[x][y]
                      	+ (x == 0 ? 255 : gray[x - 1][y])
			            + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1])
			            + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 1])
			            + (y == 0 ? 255 : gray[x][y - 1])
			            + (y == h - 1 ? 255 : gray[x][y + 1])
			            + (x == w - 1 ? 255 : gray[x + 1][ y])
			            + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 1])
			            + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]);
        return rs / 9;
    }

}

用Java做图像处理似乎还不错,呵呵。 加油封尘浪!

图像处理之加减乘除

时间: 2024-11-02 20:38:42

图像处理之加减乘除的相关文章

图像处理关键词

高频分量: 形象一点说:亮度或灰度变化激烈的地方对应高频成分,如边缘:变化不大的地方对于低频成分,如大片色块区 画个直方图,大块区域是低频,小块或离散的是高频 <1>高通滤波:边缘提取与增强.边缘区域的灰度变换加大,也就是频率较高.所以,对于高通滤波,边缘部分将被保留,非边缘部分将被过滤: <2>低通滤波:边缘平滑,边缘区域将被平滑过渡 高斯滤波:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程.通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个

【OpenCV学堂】图像处理开发者基本知识图谱

原创图像处理与机器学习文章,关注微信公众号[OpenCV学堂] 作为一个入门的图像处理开发者与工程师,要掌握的知识点也不少,不要看每个知识点只有几个字,可以说每个都代表一个算法,都有数学知识,都需要你认真领悟学习!不认真的学习一年两年你不可能做到下面的全部领悟与贯通,成为一个合格的图像处理与机器学习开发者,一个人工智能时代的程序员! 图像像素操作 - 几何运算-加减乘除 - 逻辑运算-与或非取反 - 像素读写 - 通道混合与调整 - 对比度与亮度调整 图像变换 - 插值(zoom in或out)

图像处理之基础---卷积,滤波,平滑

/*今天师弟来问我,CV的书里到处都是卷积,滤波,平滑……这些概念到底是什么意思,有什么区别和联系,瞬间晕菜了,学了这么久CV,卷积,滤波,平滑……这些概念每天都念叨好几遍,可是心里也就只明白个大概的意思,赶紧google之~ 发现自己以前了解的真的很不全面,在此做一些总结,以后对这种基本概念要深刻学习了~*/ 1.图像卷积(模板) (1).使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)

图像处理基本概念——卷积,滤波,平滑(转载)

/*今天师弟来问我,CV的书里到处都是卷积,滤波,平滑--这些概念到底是什么意思,有什么区别和联系,瞬间晕菜了,学了这么久CV,卷积,滤波,平滑--这些概念每天都念叨好几遍,可是心里也就只明白个大概的意思,赶紧google之~ 发现自己以前了解的真的很不全面,在此做一些总结,以后对这种基本概念要深刻学习了~*/ 1.图像卷积(模板) (1).使用模板处理图像相关概念: 模板:矩阵方块,其数学含义是一种卷积运算. 卷积运算:可看作是加权求和的过程,使用到的图像区域中的每个像素分别于卷积核(权矩阵)

图像处理开发者必读 - 做图像处理开发工程师很容易,只要会这些即可!

小编作为一个图像与计算机视觉的开发者,总结了一下作为图像处理开发工程师应该知道或者掌握的图像处理知识点.跟大家分享一下,以备大家学习方便. 图像像素操作 - 几何运算-加减乘除 - 逻辑运算-与或非取反 - 像素读写 - 通道混合与调整 - 对比度与亮度调整   图像几何变换 - 插值(zoom in或out) - 旋转(rotate) - 透视变换 - 错切变换 - 翻转   像素统计 - 计算均值与方差 - 计算直方图 - 计算最大最小 - 计算像素内方差   色彩空间 - RGB - HS

图像处理之三种常见双立方插值算法

http://blog.csdn.net/jia20003/article/details/40020775 图像处理之三种常见双立方插值算法 双立方插值计算涉及到16个像素点,其中(i', j')表示待计算像素点在源图像中的包含 小数部分的像素坐标,dx表示X方向的小数坐标,dy表示Y方向的小数坐标.具体 可以看下图: 根据上述图示与双立方插值的数学表达式可以看出,双立方插值本质上图像16个像素点 权重卷积之和作为新的像素值. 其中R(x)表示插值表达式,可以根据需要选择的表达式不同.常见有基

【20160924】GOCVHelper 图像处理部分(1)

增强后的图像需要通过图像处理获得定量的值.在实际程序设计过程中,轮廓很多时候都是重要的分析变量.参考Halcon的相关函数,我增强了Opencv在这块的相关功能.      //寻找最大的轮廓 VP FindBigestContour(Mat src){ int imax = 0; //代表最大轮廓的序号 int imaxcontour = -1; //代表最大轮廓的大小 std::vector<std::vector<cv::Point>>contours; findContou

详解OS X和iOS图像处理框架Core Image

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

图像处理算法交流群群规和近期福利活动

作为一名资深的图像处理算法业余爱好者,为了方便同道中人交流学习,我特别建立了一个QQ群(群号:529549320),出于新人培训之目的,也为了免去我每次都重复群规之繁琐,更为了方便群活动之开展特借CSDN宝地发此贴,以做一劳永逸之举. 关于入群资质: 1)无论你是大神还是小白,我们都欢迎: 2)无论你是业界专家还是在校学子,我们都欢迎: 3)无论你是专业精英还是业余爱好者,我们都欢迎. 总之,"是故无贵无贱,无长无少,道之所存,师之所存也". 但是,为了防止你因为不慎而加错群,我们特别