如何使用Matlab实现双线性插值算法
由于许多人在询问彩色图像的双线性插值程序,因此这里给出了一个不起眼的示例程序,应根据特定需求使用一些修改。有关完整的源程序和说明,请下载附件bilinear_rgb.rar。 %此程序由Rockins%撰写,功能是双线性互化的,以获得最大scaleor == 9.0,最小scaleor == 1.0%版权2006-2007,所有版权(c c c = = c c c limimum == 9.0,保留了所有版权。通过Rockins%,您可以在GNU下重新介绍此程序,如果您对此程序有任何疑问,请通过%YBC2084@163 com%读取源图像,并获取原始行和cols rgb = imread ('freebsd.jpg'); r = rgb(:,:,1); g = rgb(:,:2); b = rgb(:,:,3); = size(rgb); %的下一行是比例因子,范围为1.0-9.0 k = str2double(inputdlg('请输入刻度系数(必须介于1.0-9.0)','输入比例因子',1,{'5.0'}); if(k“ 1.0)|(k” 9.0)errordlg%显示源图像imshow(rgb);%输出图像宽度和高度都按因子k宽度= k * ncols;零(高度,宽度)); gg = uint8(ZEROS(高度,宽度)); bb = uint8(zeros(zeros(height,width)); out = uint8宽度(NCOMS)(NCOMS);%宽度缩放器和高度scaleor scaleor widthScale = 1 /k; heightscale = 1/k;%双线性插胸插x = k:width-k%该指数范围是避免超过y = k的允许矩阵索引:高度k xx = x * widthscale;%xx and yy是源顺序,而x和y是destinate顺序yy = y * heightscale;(xx“ ncols -1)xx = ncols -1;结束如果(yy” = 1.0e -8)yy = 1;结束if(if( yy“ nrows -1)yy = nrows -1; uint16(xx))== 1.0)&&(yy/double(uint16(yy))== 1.0)%如果a和b是整数,则j(x,y )“ -i(x,y)rr(y),x) = r(int16(yy),int16(xx)); gg(y,x)= g(int16(yy),int16(xx)); bb(y,x)= b(int16(yy),int16(xx));否则%a或b不是整数a = double(fix(yy)); %(a,b)是基本点b = double(fix(xx)); r11 = double(r(a,b)); r12 = double(r(a,b+1)); r21 = double(r(a+1,b)); r2 2 = double(r(a+1,b+1)); rr(y ,x)= uint8(((b+1-xx)*((yy-a)* r21+(a+1-yy)* r11)+(xx-b) +1-yy) * r12)); g11 = double(g(a,b)); b+1); g21 = double(g(g(a+1,b)); g22 = double(g(a+1,b+1)); xx) *(yy-a) * g21+(a+1-- yy) * g11) +(xx-b) *(yy-a) * g22 +(a +1-yy) * g12)); b11 = double(b(a,b)); b12 = double(b(a,b+1)); b21 = double(b(a+1,b)); B+1); bb(y,x)= uint8((b+1-xx) *((yy-a) * b21+(a+1-yy) * b11)+(xx-b) *(xx-b) *(yy -a) * b22 +(a +1-yy) * b12); ,3)= bb; %显示相互插图的图像(out,'freebsd2.jpg','jpg');
| (K 》 9.0) errordlg(’scale factor beyond permitted range(1.0 - 9.0)’, ’ERROR’); error(’please input scale factor (must between 1.0 - 9.0)’); end % display source image imshow(RGB); % output image width and height are both scaled by factor K width = K * ncols; height = K * nrows; RR = uint8(zeros(height,width)); GG = uint8(zeros(height,width)); BB = uint8(zeros(height,width)); OUT = uint8(zeros(height,width,ncoms)); % width scalor and height scalor widthScale = 1/K; heightScale = 1/K; % bilinear interpolate for x = K:width-K % this index range is to avoid exceeding the permitted matrix index for y = K:height-K xx = x * widthScale; % xx and yy are the source ordinate,while x and y are the destinate ordinate yy = y * heightScale; if (xx 《= 1.0e-8) xx = 1; end if (xx 》 ncols - 1) xx = ncols - 1; end if (yy 《= 1.0e-8) yy = 1; end if (yy 》 nrows - 1) yy = nrows - 1; end if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0) % if a and b is integer,then J(x,y) 《- I(x,y) RR(y,x) = R(int16(yy),int16(xx)); GG(y,x) = G(int16(yy),int16(xx)); BB(y,x) = B(int16(yy),int16(xx)); else % a or b is not integer a = double(fix(yy)); % (a,b) is the base-dot b = double(fix(xx)); r11 = double(R(a,b)); r12 = double(R(a,b+1)); r21 = double(R(a+1,b)); r22 = double(R(a+1,b+1)); RR(y,x) = uint8( (b+1-xx) * ((yy-a)*r21 + (a+1-yy)*r11) + (xx-b) * ((yy-a)*r22 +(a+1-yy) * r12) ); g11 = double(G(a,b)); g12 = double(G(a,b+1)); g21 = double(G(a+1,b)); g22 = double(G(a+1,b+1)); GG(y,x) = uint8( (b+1-xx) * ((yy-a)*g21 + (a+1-yy)*g11) + (xx-b) * ((yy-a)*g22 +(a+1-yy) * g12) ); b11 = double(B(a,b)); b12 = double(B(a,b+1)); b21 = double(B(a+1,b)); b22 = double(B(a+1,b+1)); BB(y,x) = uint8( (b+1-xx) * ((yy-a)*b21 + (a+1-yy)*b11) + (xx-b) * ((yy-a)*b22 +(a+1-yy) * b12) ); end end end OUT(:,:,1) = RR; OUT(:,:,2) = GG; OUT(:,:,3) = BB; % show the interplated image imwrite(OUT, ’FreeBSD2.jpg’, ’jpg’); figure; imshow(OUT);快速排序算法原理与实现
快速排序的基本思想是从任何数组(通常是最左边的元素)中选择一个元素作为中轴元素。将其放在中轴元素的左侧,并将其大于中轴元素大。
然后将当前中央轴元件的位置作为边界,然后将子阵列的左半部分和零件的右半视为两个新数组,重复上述操作,直到Sub--的元素数量数组小于或等于1(因为元素的元素(因为元素的元素必须有序)。
在以下代码中,通常会使用数组中两个元素值的交换方法。代码如下
公共静态空隙交换(int a,int i,int j){
int tmp;
tmp = a;
一个;
a = tmp;
扩展信息:
快速排序算法的基本思想是将排序的数字划分为左右部分,其中一个小于另一部分数据,然后将数据的两个部分除以以分配相同的数据以重复执行在执行上述操作部门,直到所有要排序的数据都井井有条。
定义两个变量低和高的变量,并将低和高的序列设置为顺序的初始元素和最后一个元素的竞标。首次,低和高的值分别为0和N-1。每个时间的下一个值由序列起始元素和序列的最终元素确定。
定义一个变量键,然后根据钥匙的值作为基准测试,将数组a作为左右部分划分为左右部分。对于正常情况,钥匙值是排序序列的第一个元素值。第一个值是A。将来,次要值由序列的起始元素确定。
从高高指向的数组元素从左至左扫描。同时,将竞标高的数组元素与准值密钥进行比较,直到高不大于低或发现第一个数组元件小于基准密钥阵列元素。然后将值分配给数组元素指向低点,并同时移动右侧位置。
如果低仍然小于高,则低点指向的阵列元素开始扫描右侧。同时,将设置的数组元素值与基准值分配的阵列元素值大于基准键,然后将值分配给指向高指向的数组元素,然后将左侧移动到左侧。
重复步骤(3)(4),直到植物不少于高。目前,成功部门后获得的左和右部件是A.Key的,因此在部门的末尾,必须将出售POS的数组元素分配给密钥。
Reference materials: Quick Sorting Algorithm_ 百度 贴 吧
快速排序算法
QuickSort是冒泡分类的改进。
然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
重复上述过程,我们可以看到这是一个递归定义。左侧的顺序通过递归放电后,右侧的顺序是递归的。左侧和右侧的每种数据完成后,整个阵列的排序已完成。
快速对算法进行分类以通过多个比较和交换完成分类。排序过程如下:
(1)首先设置一个分隔值,然后通过除法值将数组数分为左右部分。
(2)将数据集中到大于或等于数组右侧的划分值,并且数据小于划分值的数据集中在数组的左侧。小于或等于分隔值,右侧的元素大于或等于分隔值。