实验截图:
实验代码:
求平均:
img=imread('erciyuan.jpg');
img=rgb2gray(img);
img=double(img);
[m,n]=size(img);
s=0;
for x=1:m
for y=1:n
s=s+img(x,y); %求像素值总和 s
end
end
%所有像素均值
a1=mean(mean(img)); %第一种方法:先计算列向量均值,再求总均值。
a2=mean2(img); %第二种方法:用函数mean2求总均值
a3=s/(m*n); %第三种方法:按公式计算,像素值总和除以像素个数。
a4=sum(sum(img))/(m*n); %第四种方法:也是按公式计算,但是用sum来求像素值总和。
减法求前景:
I= imread('1.png');
subplot(1,3,1);
imshow(I,[]);
title('有指纹的钱币');
i=im2double(I);
J=imread('2.png');
subplot(1,3,2);
imshow(J,[]);
title('无指纹的钱币');
j=im2double(J);
p=i-j; %两张图片相减
p=p*255;
subplot(1,3,3);
imshow(p,[]);
title('相减后浮现出的指纹');
乘法求感兴趣区:
img = imread('erciyuan.jpg');
img_orginal = img;
img2 = zeros(size(img));
img2 = img2 + 255;
img = rgb2gray(img);
figure('MenuBar', 'none');
imshow(img, 'Border','tight');
hold on;
P = [];
num = 1;
[x, y, k] = ginput(1);
P = [P; x y];
plot(x, y, 'r.', 'MarkerSize', 5);
while k == 1
num = num + 1;
[x, y, k] = ginput(1);
if k ~= 1
break;
end
P = [P; x y];
plot(x, y, 'r.', 'MarkerSize', 5);
if num > 1
line([P(num-1, 1) P(num, 1)], [P(num-1, 2) P(num, 2)],'Color', 'r', 'LineWidth', 2);
end
end
line([P(1, 1) P(end, 1)], [P(1, 2) P(end, 2)], 'Color', 'r', 'LineWidth', 2);
mf = getframe(gca);
If = frame2im(mf);
img = If;
hsv = rgb2hsv(img);
s = hsv(:, :, 2);
fill = imfill(s, 'holes');
img_orginal = (img_orginal .* uint8(fill));
figure('MenuBar', 'none');
imshow(img_orginal, 'Border', 'tight');
旋转(1):
I=imread('erciyuan.jpg');
I_45_1=imrotate(I,45,'bilinear');
I_45_2=imrotate(I,-45,'bilinear');
subplot(1,3,1);
imshow(I);
subplot(1,3,2);
imshow(I_45_1);
subplot(1,3,3);
imshow(I_45_2);
旋转(2):
im = imread('erciyuan.jpg');
a = 45 / 180 * pi;
R = [cos(a), -sin(a); sin(a), cos(a)];
R = R';
sz = size(im);
h = sz(1);%得到原图像的高
w = sz(2);%得到原图像的宽
channel = sz(3);%得到原图像的通道数
center1 = [h; w] / 2;
% 计算显示完整图像需要的画布大小
nh = floor(w*sin(a)+h*cos(a))+1;
nw = floor(w*cos(a)+h*sin(a))+1;
center2 = [nh; nw] / 2;
% 初始化目标画布
img_45 = uint8(ones(nh, nw, 3)*128);
for k = 1:channel
for i = 1:nh
for j = 1:nw
point = [i; j];
Rpoint = (R*(point-center2)+center1);
mn = floor(Rpoint);
ab = Rpoint - mn;
a = ab(1);
b = ab(2);
m = mn(1);
n = mn(2);
% 线性插值方法
if (Rpoint(1) >= 2 && Rpoint(1) <= h-1 && Rpoint(2) >= 2 && Rpoint(2) <= w-1)
img_45(i, j, k) = (1-a)*(1-b)*im(m, n, k) + a*(1-b)*im(m+1, n, k)...
+ (1-a)*b*im(m, n, k) + a*b*im(m, n, k);
end
end
end
end
subplot(121)
imshow(img);
title('原图')
subplot(122)
imshow(img_45);
title('旋转了45度后的图')
结果分析:
求平均:
- 这个实验中我们主要使用的是mean()和mean2()这两个函数来求出图像的平均值,这里我学习并使用了四种方法来求平均值,在matlab中,mean()可以用来求行或列向量的均值,第一种方法就是连续使用两次mean()直接对图像求平均值,即:mean(mean(img));第二种方法是使用mean2()来求,这个函数的作用是相当于对整一个矩阵求像素平均值,即为mean2(img);第三种方法是我们设置m、n来分别表示图像的长和宽,然后利用一个二重循环将每个像素点的值加起来,最后像素值总和除以像素个数就能求出平均值,即为:s/(m*n);第四种方法使用sum()函数来求出像素值总和,这个方法与第三种差不多,这里不过多赘述。
减法求前景:
- 在这个实验中,我们可以通过相减的方法来求出两张图片的差异,这里我选用的是来自网上的图片,一张有指纹的钱币和同一张钱币没有指纹的情况,只要将图片通过im2double()函数转换一下就能就行减法运算,相减后得到的就是前景图片。
乘法求感兴趣区:
- 我们可以通过设定一个截取框来对原图进行感兴趣区域的截取,截取完成后,就可以对感兴趣区域的图片(灰度图)将其转化为hsv图片后通过hsv(:, :, 2)计算并填充,再与原图点乘后就能得到我们要的结果。
旋转:
- 在这个实验中,我们可以使用matlab自带的函数imrotate()来进行图片的旋转,输入的角度为正数时,整个图片按中心点逆时针旋转对应角度,输入角度为负数时,整个图片按中心点顺时针旋转对应角度。
- 我们也可以不借助自带的函数,而使用线性插值法来实现,线性插值法的思路总的来说就是分两次做插值计算,先用插值算出P1和P2点的像素值在用这两点求出P点的像素值。
- 求出P1和P2的公式如下
P1 = b*im(m, n) + (1-b) * im(m+1, n)
P2 = b * im(m, n+1) + (1-b) * im(m+1, n+1) - 求出P的公式如下
P = a * P1 + (1-a) * P2
= a * [b * im(m, n) + (1-b) * im(m+1, n)] + (1-a) * [b * im(m, n+1) + (1-b) * im(m+1, n+1)]
= a * b * im(m, n) + a * (1-b) * im(m+1,n) + (1-a) * b * im(m, n+1) + (1-a) * (1-b) * im(m+1, n+1)