9月 142013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

通过访问像素来进行二值化处理

int main()
{
    IplImage *src = cvLoadImage("D:/1.jpg");  
	IplImage *dst = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);
	CvSize size = cvGetSize(src);
	CvScalar s;
	if(src==NULL)
	{
		printf("Load failed!\n");
	    return -1;
	}
	//(int i;i<src.)
	//cvCvtColor(src,dst,CV_BGR2GRAY);
	for(int i=0;i<size.height;i++)
		for(int j=0;j<size.width;j++)
		{
		    s=cvGet2D(src,i,j);
			double tmp = (s.val[0]+s.val[1]+s.val[2])/3;
			if(tmp > 128)
				s.val[0]=s.val[1]=s.val[2] = 255;
			else if(tmp <= 128)
				s.val[0]=s.val[1]=s.val[2] = 0;			
			cvSet2D(dst,i,j,s);
		}
	cvNamedWindow("Image", 1);
	cvShowImage("Image", dst);
	cvWaitKey(0);

	cvDestroyWindow("Image");
	cvReleaseImage(&dst);
	cvReleaseImage(&src);
	return 0;
}
4月 142013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

假设要访问第k通道、第i行、第j列的像素
cvGet2D用于获取对应点的数据
cvSet2D用于设置对应点的数据
s.val(i)
获取i通道的值
s.val(i,data)
设置i通道的值为data

public class test { 
    public static void main(String args[]){ 
    IplImage img = cvLoadImage("D:\\car.bmp",3); 
    if (null == img)//如果读入失败,退出程序 
    System.exit(1); 
    /*创建一个单通道的图像*/
    IplImage imgc = cvCreateImage(cvSize(img.width(),img.height()),IPL_DEPTH_8U,0);
    /*
    CvScalar就是一个可以用来存放4个double数值的数组;一般用来存放像素值(不一定是灰度值哦)的,最多可以存
    放4个通道的。
    typedef struct CvScalar
    {
      double val[4];
      }CvScalar; 
    */
    CvScalar s,to=null;
    int i=10,j=5;
    s = cvGet2D(img,i,j); //注意i表示y坐标,j表示x坐标
    System.out.printf("intensity=%f\n",s.val(0));
    cvCvtColor(img,imgc,CV_BGR2GRAY);
    for(i=0;i<img.height();i++)
        for(j=0;j<img.width();j++)
        {  
            /*灰度变换
            s = cvGet2D(img,i,j); 
            to = cvGet2D(imgc,i,j);
            to.val(0,(int)(s.val(0)*0.114+s.val(1)*0.587+s.val(2)*0.299));
            cvSet2D(imgc,i,j,s);//写到图片里
            */
            /*二值化处理*/
            s = cvGet2D(imgc,i,j);
            if(s.val(0)&gt;100)
            {
                s.val(0,256); 
            }
            else
            {
                s.val(0,0); 
            }
        cvSet2D(imgc,i,j,s);//写到图片里 
        }

    s = cvGet2D(img,5,10);
    System.out.printf("intensity=%f\n",s.val(0));
    //创建一个窗口,标题为Example 
    cvNamedWindow("Example",CV_WINDOW_AUTOSIZE); 
    //在窗口Example中显示图片
    cvShowImage("Example",imgc); 
    //暂停程序,等待用户触发一个按键
    cvWaitKey(0); 
    //释放图像所分配的内存 
    cvReleaseImage(imgc); 
    //销毁窗口 
    cvDestroyWindow("Example"); 
} 

}

对数变换

s = cvGet2D(img,i,j);
s.val(0,Math.log(s.val(0)));
cvSet2D(imgc,i,j,s);//写到图片里
4月 142013
 

Your ads will be inserted here by

Easy AdSense.

Please go to the plugin admin page to
Paste your ad code OR
Suppress this ad slot.

一、读取图像

im = imread(‘filename’)

读取灰度图像

一个8位的灰度图像的每一个像素只有一个字节来记录,所在调用imread后返回的结果是一个uint8型的二维数组,第一维代表的是行,第二维代表的是列。

im = imread(‘filename’)

读取RGB图像

RGB图像由于有三个通道的信息,返回的是uint8型的三维数组,其中第一维代表的是行,第二维代表的是列,第三维代表的是一个颜色通道,对于RGB来说,第三维的大小一定为3,可以通过(:, :, 1)来取出红色通道的颜色信息,(:, :, 2)是绿色通道。调用格式和灰度图像相同,都是:

im = imread(‘filename’)

调用imfinfo函数来观察图像的信息

imfinfo(‘filename’)

二、图像类型转

真彩图像→索引图像

X=dither(RGB,map)

节省存储空间,假彩色

索引图像→真彩图像

RGB=ind2rgb(X,map)

便于图像处理

真彩图像→灰度图像

I=rgb2gray(RGB)

得到亮度分布

真彩图像→二值图像

BW=im2bw(RGB,level)

阈值处理,筛选

索引图像→灰度图像

I=ind2gray(X,map)

Newmap=rgb2gray(map)

得到亮度分布

灰度图像→索引图像

[X,map]=gray2ind(I,n),

X=grayslice(I,n)

X=grayslice(I,v)

伪彩色处理

灰度图像→二值图像

BW=dither(I)

BW=im2bw(I,level)

阈值处理,筛选

索引图像→二值图像

BW=im2bw(X,map,level)

阈值处理,筛选

数据矩阵→灰度图像

I=mat2gray(A,[max,min])

I=mat2gray(A)

产生图像

y = ind2gray(x, map); %索引图像转换为灰度图像

[y, map] = gray2ind(x); %灰度图像转换为索引图像

y = rgb2gray(x); %RGB图像转换为灰度图像

[y, map] = rgb2ind(x, n); %RGB图像转换为索引图像

y = ind2rgb(x, map); %索引图像转换为RGB图像

三、图像存储imwrite

imwrite(im, ‘filename’, ‘format’);

format 可以为PNG,BMP,GIF

索引图像

imwrite(im, immap, ‘filename’, ‘format’);

四、图像显示

1、image

image是最原始的显示图像的函数,对于灰度图像

image(im), truesize, axis off, colormap(gray(256));

这里truesize显示图像和实际大小相同,axis off去掉了坐标轴,gray(256)是将0到1之间分出256个不同的灰度,正好对应的灰度图像的范围

如果是彩色图像,就不需要colormap这个参数了,直接调用image即可正常显示。

2、imshow

imshow也可以用来显示图像,如果传入数据是原始的uint8类型的,不管是灰度图像和RGB图像都可以直接正常显示。不过如果将数据直接转为double类型,图像就无法正常显示,因为当传入double类型的时候,函数会认为0代表黑,1.0代表白,所以一般情况下这种错误操作很可能显示一幅全白图像。

为了避免自己转换类型出错,可以使用im2double或im2uint8函数,这样不管数据范围是0到255还是0到1都可以正确地进行数据转换。

im = imread(‘cameraman.tif’);

subplot(1, 3, 1);

imshow(im);

subplot(1, 3, 2);

imshow(im2double(im));

subplot(1, 3, 3);

imshow(im2double(double(im) / 256));

五、图像的缩放imresize

利用imresize(im, scale, method)或imresize(im, [row col], method)

method控制的就是插值的方法:bicubic  bilinear  nearest

六、点处理Point Processing

1、算术操作 Arithmetic operations

主要是加减乘除处理

im = imread(‘lena.jpg’);
im1 =imadd(im,128);
im2 = imsubtract(im,128);
im3 = immultiply(im,2);
im4 = imdivide(im,2);
subplot(2, 2, 1);
imshow(im1);
title(‘Add’);
subplot(2, 2, 2);
imshow(im2);
title(‘Subtract’);
subplot(2, 2, 3);
imshow(im3);
title(‘Multiply’);
subplot(2, 2, 4);
imshow(im4);
title(‘Divide’);

颜色反转 imcomplement

imcomplement(im);

2、直方图 Histograms

imhist(im),axis tight;

注意必须是灰度图,否则会报错

2.1直方图拉伸 Histogram Stretching

imadjust(im, [a, b], , gamma)

gamma不写默认值为1,[a, b]是要拉伸的范围,是拉伸后的范围,a、b、c、d均为0到1之间的double类型的数字