2018-11-15 17:23:50 qq_43685640 阅读数 490

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

这次我们要处理的是对图像进行旋转操作,具体要求,如下:

       自定义一个图像的仿射变换函数,用于旋转给定的输入图像,该函数的输入参数包括处理前的图像和旋转角度。输入的角度为正数,表明处理结果为顺时针旋转,负数则为逆时针旋转,输出参数为处理后的图像。

       曾参考《数字图像处理(第三版)》一书中P51的公式编写过自己的图像“旋转”函数,但是在某些角度下,输出结果却发生了错误,至于原因,也由于时间关系,仍未思考出来。使用Matlab编程,原代码如下:

%自己写的函数function []=myRotation(pho,angle)im1=imread(pho);subplot(121);imshow(im1);title('输入图像');im1=double(im1);[r,c,h]=size(im1); R=angle*pi/180;h2 = ceil(r*cos(R)+c*sin(R));w2 = ceil(r*sin(R)+c*cos(R));im2=zeros(h2,w2,h); T=[sin(R) cos(R); cos(R) -sin(R)];%invT=inv(T);for i=1:h    for x=1:h2        for y=1:w2            temp=([x y]-[0 r*sin(R)])/T;            temp(1)=ceil(temp(1));            temp(2)=ceil(temp(2));            if temp(2)>0 && temp(2)<=r && temp(1)>0 && temp(1)<=c                im2(x,y,i)=im1(temp(2),temp(1),i);            end        end    endendsubplot(122);imshow(uint8(im2));title('输出图像');

       另外,采用了一种方法(参考 点击打开链接),同样使用推导出来的公式,采用反向映射的方法,结合双线性内插,得出旋转后的图像。但是得出来的结果,如输入 180°,没有出现输出结果。参考后修改的程序如下:

function []=myRotation3(pho,angle)im1=imread(pho);im1=double(im1);[m,n,h]=size(im1); R = angle*pi/180;   %旋转角度%新图像大小m2 = ceil(m*cos(R)+n*sin(R));n2 = ceil(m*sin(R)+n*cos(R)); u0= m*sin(R);%平移量 %变换矩阵   T=[cos(R),sin(R);-sin(R),cos(R)];L = zeros(m2,n2);for i=1:h    for u=1:n2      for v=1:m2        %新图像坐标变换到原图像坐标x和y中        temp = T*([u;v]-[u0;0]);        x= temp(1);        y= temp(2);        if x>=1 & x<=m & y>=1 & y<=n    %若变换出的x和y在原图像范围内            x_low=floor(x);            x_up=ceil(x);            y_low=floor(y);            y_up=ceil(y);    %双线性内插值            p1=im1(x_low,y_low,i);            p2=im1(x_up,y_low,i);            p3=im1(x_low,y_low,i);            p4=im1(x_up,y_up,i);            s=x-x_low;            t=y-y_low;            L(u,v,i)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4;        end      end    endend imshow(uint8(L));title('输出图像');

而正确程序代码,则是通过研究参考 图像旋转算法原理点击打开链接),在只有原理的情况下,研究透,将其转化为 程序。MATLAB代码如下:

%这个旋转才没有bugfunction []=myRotation(pho,angle)im1=imread(pho);subplot(121);imshow(im1);title('输入图像');im1=double(im1);[r,c,h]=size(im1); %将角度单位化为弧度单位R=-angle*pi/180;%这样的宽高会出现BUG,原因不明%h2 = ceil(r*cos(R)+c*sin(R));%w2 = ceil(r*sin(R)+c*cos(R)); %将对角线作为旋转后图像的宽高h2=ceil(sqrt(r*r+c*c));w2=h2; im2=zeros(h2,w2,h); %旋转时x y的偏移量dx=-0.5*w2*cos(R)-0.5*h2*sin(R)+0.5*c;dy=0.5*w2*sin(R)-0.5*h2*cos(R)+0.5*r; %采用反向映射for i=1:h    for x=1:h2        for y=1:w2            %由结果图像的坐标 得出 原来图像的坐标            x0=ceil(x*cos(R)+y*sin(R)+dx);             y0=ceil(-x*sin(R)+y*cos(R)+dy);                        if x0>0 && x0<=r && y0>0 && y0<=c                im2(x,y,i)=im1(x0,y0,i);            end        end    endend%显示图像subplot(122);imshow(uint8(im2));title('输出图像');


旋转45°——> myRotation('实验2_lena.bmp',45),结果如下:


旋转-45°——> myRotation('实验2_lena.bmp',-45),结果如下:


图像反色处理

       自定义一个函数,将输入图像进行反色处理,该函数输入参数为处理前的图像,输出参数为处理后的图像。

Matlab编程,代码如下:

function []=myFanse(pho)im1 = imread(pho);subplot(121);imshow(im1);title('输入图像');im1 = double(im1);[r c m] = size(im1);im2 = zeros(r,c,m);for i=1:mfor j=1:rfor k=1:cim2(j,k,i)=255-im1(j,k,i); %由最高灰度级减去原坐标位置的灰度级进行反色endendendim2 = uint8(im2);subplot(122);imshow(im2);title('输出图像');
       当然,其实也可以利用Matlab中的矩阵运算编写程序,这样程序可以更加精简,这里就不给出了。   

       myFase('实验2_lena.bmp'),运行结果如下:


图像对比度拉伸变换

  自定义一个图像的对比度拉伸函数,将输入图像的对比度拉伸到指定的灰度级区间,该函数的输入参数包括处理前的图像、期望灰度级区间的最小值和最大值(如指定区间为[50 200]),输出参数为处理后的图像。

Matlab代码如下:

function []=myContrConver(pho, mi, ma)im1 = imread(pho);subplot(121);imshow(im1);title('输入图像');im1 = double(im1);[r c m] = size(im1);im2 = zeros(r,c,m);%for i=1:m%    for j=1:r%        for k=1:c%            im2(j,k,i)=min+(im1(j,k,i)-minR)/(maxR-minR)*(max-min);%        end%    end%end %先对原图像的 灰度级 进行归一化,再由归一化的区间缩放至所需区间tempIma1=im1(:,:,1);tempIma2=im1(:,:,2);tempIma3=im1(:,:,3);im2(:,:,1)=mi+(im1(:,:,1)-min(tempIma1(:)))/(max(tempIma1(:))-min(tempIma1(:)))*(ma-mi);im2(:,:,2)=mi+(im1(:,:,2)-min(tempIma2(:)))/(max(tempIma2(:))-min(tempIma2(:)))*(ma-mi);im2(:,:,3)=mi+(im1(:,:,3)-min(tempIma3(:)))/(max(tempIma3(:))-min(tempIma3(:)))*(ma-mi); im2=uint8(im2);subplot(122);imshow(im2);title('输出图像');


       myContrConver('实验2_lena.bmp'),运行结果如下:



           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述
2006-07-07 00:10:00 chenamo9651 阅读数 13321

1、  基本原理

对于彩色图像的RGB各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理。

2、  实现

procedure TForm1.Button2Click(Sender: TObject);

var

        p:PByteArray;

        Gray,x,y:integer;

begin

        self.FormDestroy(self);

        TestBMP:=TBitmap.Create;

        changedbmp:=tbitmap.Create;

        testbmp.Assign(image1.Picture);

        for y:=0 to testbmp.Height-1 do

        begin

                p:=testbmp.ScanLine[y];

                for x:=0 to testbmp.Width-1 do

                begin

                        p[x*3]:=not p[x*3];

                        p[x*3+1]:=not p[x*3+1];

                        p[x*3+2]:=not p[x*3+2];

                end;

        end;

        ChangedBmp.Assign(TestBMP);

        PaintBox1.Canvas.CopyMode:=srccopy;

        PaintBox1.Canvas.Draw(0,0,ChangedBmp);

end;

3、  效果

 
2018-12-29 21:48:07 yql_617540298 阅读数 1537

一、原理

       反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。所以处理很简单,把反转后的R、G、B值写入新图即可,比如一个点的颜色为(0,0,0),反色后为(255,255,255)。带调色板的彩色图,其位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。

二、源码

import cv2
import os
from time import clock

filepath = 'C:/Users/Administrator/Desktop/tran_image'
resultpath = 'C:/Users/Administrator/Desktop/tran_image_devert'
count = os.listdir(filepath)
start = clock()
for m in range(0,len(count)):
    image = cv2.imread(filepath+'/'+str(m)+'.jpg')
    image2 = image.copy()
    for i in range(0,image.shape[0]):
        for j in range(0,image.shape[1]):
            image2[i,j]= 255 - image[i,j]
    cv2.imwrite(resultpath+'/'+str(m)+'.jpg',image2)
final = clock
print("devert_time=",final-start)

 

2012-01-18 16:36:47 iteye_7333 阅读数 139

图像反色

对于彩色图像的 R、G、B 各彩色分量取反的技术就是图像的反色处理,这在处理二值化图像的连通区域选取的时候非常重要。如物体连通域用黑色表示,而二值化后的物体连通域图像可那是白色的,而背景是黑色的,这时应手动选取图像的反色处理或有程序根据背景和物体连通域两种颜色的数量所占比例而自动选择是否选择选取图像的反色处理,其算法很简单,假设源图像一像素的红,绿,蓝分量为 (R,G,B),则目标图像该像素的红绿蓝分量应变为 (255 - R,255 - G, 255 - B)。

	private static ImageData reverseImage(ImageData srcData)
	{
		int bytesPerPixel = srcData.bytesPerLine / srcData.width;
		int destBytesPerLine = srcData.width * bytesPerPixel;
		byte[] newData = srcData.data;

		for (int i = 0; i < newData.length; i ++)
			newData[i] = (byte) (255 - newData[i]);
		ImageData newImageData = new ImageData(srcData.width, srcData.height, 
				srcData.depth, srcData.palette, destBytesPerLine, newData);
		newImageData.transparentPixel = srcData.transparentPixel;

		return newImageData;
	}

 

 

图像拉伸

图像的缩小/放大一般分为按比例缩小和不按比例缩小两种。图像的缩小操作中,是在现有的信息里如何挑选所需要的有用信息。图像的放大操作中,则需对尺寸放大后所多出来的空格填入适当的值,这是信息的估计问题,所以较图像的缩小要难一些,而且图像大比例放大时经常会出现马赛克效应。庆幸的是,SWT 工具箱对图像的拉伸进行了封装,开发者只需要调用方法 ImageData.scaledTo(int width, int height) 来获得一个拉伸后的 ImageData。

Image newImage = new Image(null, imageData[0].scaledTo(imageData[0].width / 2,
                          imageData[0].height / 2));

 

 

图像透明叠加

透明叠加方式是图象处理中常用的一种处理方式,在这种处理方式中,一幅图片叠加到另一幅图片上,但是这幅图象不是完全将原来的图象覆盖,而是能够部分的透过叠加的图象显示出来,透明的程度由透明度参数指定(假定为 a,其值在 0 与 1 之间,数值越小表明被叠加的图片越透明),其原理是目标图片的 R、G、B 以及 alpha 分别为待叠加图片 1 的 R、G、B 以及 alpha 分量乘以透明度参数 a 加上待叠加图片 2 的 R、G、B 以及 alpha 分量乘以 1-a 的值。我们可以使用图片的透明叠加作出水印的效果。

	private static ImageData watermark(ImageData srcData1, ImageData srcData2, double alpha) {
		if(srcData1.width != srcData2.width || srcData1.height != 
			srcData2.height || rcData1.bytesPerLine != srcData2.bytesPerLine)
			//未考虑不同大小图片的叠加
			return null;
		int bytesPerPixe = srcData1.bytesPerLine / srcData1.width;
		int destBytesPerLine = srcData1.width * bytesPerPixe;
		byte[] newData = new byte[srcData1.data.length];

		ImageData newImageData = new ImageData(srcData1.width, srcData1.height, srcData1.depth,
				srcData1.palette, destBytesPerLine, newData);
		for (int srcY = 0; srcY < srcData1.height; srcY++) {
			for (int srcX = 0; srcX < srcData1.bytesPerLine; srcX++) {
				int idx = srcY * srcData1.bytesPerLine + srcX;
				newImageData.data[idx] = (byte)(alpha * srcData1.data[idx]  + 
						(1- alpha) * srcData2.data[idx]);
			}
		}
		return newImageData;
	}

 


需要说明的是,以上所列举的清单中大部分都没有对透明度数据进行处理,读者如对带有透明度数据图片进行处理的时候,可自行添加相关代码,其处理过程跟对 ImageData 数据处理过程类似。

2015-04-07 10:14:49 Trent1985 阅读数 1394

[函数名称]

图像反色函数ContraryProcess(WriteableBitmap src)

[算法说明]

    反色公式如下:       P'(x,y) = 255 - P(x,y);

    P'(x,y)为反色后的像素值,P(x,y)是原始像素值。

[函数代码]

       ///<summary>

       /// Contrary process.

       ///</summary>

       ///<param name="src">Source image.</param>

       ///<returns></returns>

 publicstaticWriteableBitmap ContraryProcess(WriteableBitmap src)////3反色处理

       {

           if(src!=null )

           {

           int w = src.PixelWidth;

           int h = src.PixelHeight;

           WriteableBitmap contraryImage =newWriteableBitmap(w, h);

           byte[] temp = src.PixelBuffer.ToArray();

           for (int i = 0; i < temp.Length; i += 4)

           {

               temp[i] = (byte)(255 - temp[i]);

               temp[i + 1] = (byte)(255 - temp[i + 1]);

               temp[i + 2] = (byte)(255 - temp[i + 2]);

           }

           Stream sTemp = contraryImage.PixelBuffer.AsStream();

           sTemp.Seek(0,SeekOrigin.Begin);

           sTemp.Write(temp, 0, w * 4 * h);

           return contraryImage;

           }       

           else

           {

               returnnull;

           }  

       }


 

没有更多推荐了,返回首页