1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 数字图像处理实验边缘检测 图像分割 图像合成等

数字图像处理实验边缘检测 图像分割 图像合成等

时间:2022-01-07 03:48:45

相关推荐

数字图像处理实验边缘检测 图像分割 图像合成等

内容要求:

采用图1,Matlab编程实现如下处理结果:

1、转换为灰度图像;

2、将夜空中的星星当作噪声滤除;.

3、将月亮、山脉和湖泊进行图像分割,并填充成

不同的灰度级做标记;

4、计算月亮的面积;

5、将校徽logo叠加在月球中心,大小一致;

先上效果图:

输入图像、图像灰度化、滤除星星

clcclearclose all%----------------------------灰度化和中值滤波-------------------------------Image = imread('1.png'); % 读取图片Gray = rgb2gray(Image);% 图像灰度化% 滤除星星Med = medfilt2(Gray,[6,6]); % 5*5中值滤波figure;subplot(1,3,1);imshow(Image);title('原图像');subplot(1,3,2);imshow(Gray);title('灰度图像');subplot(1,3,3);imshow(Med);title('中值滤波');

用Sobel算子进行边缘检测

%--------------------------分割月亮、山脉和湖泊-----------------------------% Sobel算子分割Med = im2double(Med);mBlock = fspecial('sobel');mImgDy = imfilter(Med, mBlock, 'replicate');mImgDx = imfilter(Med, mBlock','replicate');mImgDxy = sqrt(mImgDy.*mImgDy+mImgDx.*mImgDx);figure;subplot(1,2,1),imshow(Med),title('灰度图');subplot(1,2,2),imshow(mat2gray(mImgDxy)),title('sobel梯度图');

标记边缘和优化边缘痕迹

% 标记湖泊边缘Fenge = mImgDxy;[n,m] = size(Med);for j = 1:mFenge(360,j) = 1;end% 突出月亮Fenge = imfill(Fenge,'holes'); % 填充黑色背景内的白色部分% 优化山脉边缘for i = 1:nfor j = 1:mif Fenge(i,j) >= 0.33Fenge(i,j) = 1;endendend% 转为二值图像for i = 1:nfor j = 1:mif Fenge(i,j) ~= 1Fenge(i,j) = 0;endendend

月亮、山脉和湖泊分为不同灰度级

% 不同灰度分别标记% 湖泊for j = 1:mfor i = n:-1:360if Fenge(i,j) == 0Fenge(i,j) = 0.3;endendend% 山脉for j = 1:mfor i = 359:-1:1if Fenge(i,j) == 0Fenge(i,j) = 0.6;endif Fenge(i,j) == 1break;endendend% 月亮for i = 1:nfor j = 1:mif Fenge(i,j) == 1Fenge(i,j) = 0.1;endendendFenge = Fenge + Med;figure;imshow(Fenge);title('分割图像');

计算月亮面积并记录在TXT内

%------------------------------计算月亮面积---------------------------------mImgDxy = imfill(mImgDxy,'holes'); % 填充黑色背景内的白色部分for i = 1:nfor j = 1:mif mImgDxy(i,j) > 1mImgDxy(i,j) = 1;endendendfor i = 1:nfor j = 1:mif mImgDxy(i,j) < 1mImgDxy(i,j) = 0;endendendround_area = regionprops(mImgDxy,'Area');fprintf('月亮面积是%f Area\n',round_area(1,1).Area);% 记录在TXT文件内fid=fopen('S.txt','a+');fprintf(fid,'%s\r\n',sprintf('月亮面积是%f Area\n',round_area(1,1).Area));

月亮和二工大logo合成

%--------------------------月亮和二工大logo合成-----------------------------logo = imread('logo.png'); % 读取logo图片% 滤除背景[n,m] = size(logo);for i = 1:nfor j = 1:mif logo(i,j) >= 235logo(i,j) = 0;endendend% 对logo三个通道中值滤波R = logo(:,:,1);G = logo(:,:,2);B = logo(:,:,3);R = medfilt2(R,[4,4]);G = medfilt2(G,[4,4]);B = medfilt2(B,[4,4]);logo = cat(3,R,G,B);% figure;% imshow(logo);title('logo图像');% 取两张图片的三个通道logo = imresize(logo,0.4); % logo图像缩小以匹配月亮大小R_logo=logo(:,:,1);G_logo=logo(:,:,2);B_logo=logo(:,:,3);HeCheng = Image;R_HeCheng = HeCheng(:,:,1);G_HeCheng = HeCheng(:,:,2);B_HeCheng = HeCheng(:,:,3);% 计算月亮所处坐标[n,m] = size(mImgDxy);for i = 1:nfor j = 1:mif mImgDxy(i,j) == 1hang = i;breakendendif mImgDxy(i,j) == 1breakendendfor j = 1:mfor i = 1:nif mImgDxy(i,j) == 1lie = j;breakendendif mImgDxy(i,j) == 1breakendend% 通过三个通道合成[n,m] = size(logo);for i = 1:nfor j = 1:162R_HeCheng(i+hang-1,j+lie-1) = R_HeCheng(i+hang-1,j+lie-1) + R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_HeCheng(i+hang-1,j+lie-1) + G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_HeCheng(i+hang-1,j+lie-1) + B_logo(i,j);endendHeCheng = cat(3,R_HeCheng,G_HeCheng,B_HeCheng);figure;imshow(HeCheng);title('合成图像');

二工大logo覆盖月亮

% 通过三个通道覆盖for i = 1:nfor j = 1:162if logo(i,j) == 0 R_HeCheng(i+hang-1,j+lie-1) = R_HeCheng(i+hang-1,j+lie-1) + R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_HeCheng(i+hang-1,j+lie-1) + G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_HeCheng(i+hang-1,j+lie-1) + B_logo(i,j);elseR_HeCheng(i+hang-1,j+lie-1) = R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_logo(i,j);endendendFuGai = cat(3,R_HeCheng,G_HeCheng,B_HeCheng);figure;imshow(FuGai);title('覆盖图像');

完整代码

clcclearclose all%----------------------------灰度化和中值滤波-------------------------------Image = imread('1.png'); % 读取图片Gray = rgb2gray(Image);% 图像灰度化% 滤除星星Med = medfilt2(Gray,[6,6]); % 5*5中值滤波figure;subplot(1,3,1);imshow(Image);title('原图像');subplot(1,3,2);imshow(Gray);title('灰度图像');subplot(1,3,3);imshow(Med);title('中值滤波');%--------------------------分割月亮、山脉和湖泊-----------------------------% Sobel算子分割Med = im2double(Med);mBlock = fspecial('sobel');mImgDy = imfilter(Med, mBlock, 'replicate');mImgDx = imfilter(Med, mBlock','replicate');mImgDxy = sqrt(mImgDy.*mImgDy+mImgDx.*mImgDx);% figure;% subplot(1,2,1),imshow(Med),title('灰度图');% subplot(1,2,2),imshow(mat2gray(mImgDxy)),title('sobel梯度图');% 标记湖泊边缘Fenge = mImgDxy;[n,m] = size(Med);for j = 1:mFenge(360,j) = 1;end% 突出月亮Fenge = imfill(Fenge,'holes'); % 填充黑色背景内的白色部分% 优化山脉边缘for i = 1:nfor j = 1:mif Fenge(i,j) >= 0.33Fenge(i,j) = 1;endendend% 转为二值图像for i = 1:nfor j = 1:mif Fenge(i,j) ~= 1Fenge(i,j) = 0;endendend% 不同灰度分别标记% 湖泊for j = 1:mfor i = n:-1:360if Fenge(i,j) == 0Fenge(i,j) = 0.3;endendend% 山脉for j = 1:mfor i = 359:-1:1if Fenge(i,j) == 0Fenge(i,j) = 0.6;endif Fenge(i,j) == 1break;endendend% 月亮for i = 1:nfor j = 1:mif Fenge(i,j) == 1Fenge(i,j) = 0.1;endendendFenge = Fenge + Med;figure;imshow(Fenge);title('分割图像');%------------------------------计算月亮面积---------------------------------mImgDxy = imfill(mImgDxy,'holes'); % 填充黑色背景内的白色部分for i = 1:nfor j = 1:mif mImgDxy(i,j) > 1mImgDxy(i,j) = 1;endendendfor i = 1:nfor j = 1:mif mImgDxy(i,j) < 1mImgDxy(i,j) = 0;endendendround_area = regionprops(mImgDxy,'Area');fprintf('月亮面积是%f Area\n',round_area(1,1).Area);% 记录在TXT文件内fid=fopen('S.txt','a+');fprintf(fid,'%s\r\n',sprintf('月亮面积是%f Area\n',round_area(1,1).Area));%--------------------------月亮和二工大logo合成-----------------------------logo = imread('logo.png'); % 读取logo图片% 滤除背景[n,m] = size(logo);for i = 1:nfor j = 1:mif logo(i,j) >= 235logo(i,j) = 0;endendend% 对logo三个通道中值滤波R = logo(:,:,1);G = logo(:,:,2);B = logo(:,:,3);R = medfilt2(R,[4,4]);G = medfilt2(G,[4,4]);B = medfilt2(B,[4,4]);logo = cat(3,R,G,B);% figure;% imshow(logo);title('logo图像');% 取两张图片的三个通道logo = imresize(logo,0.4); % logo图像缩小以匹配月亮大小R_logo=logo(:,:,1);G_logo=logo(:,:,2);B_logo=logo(:,:,3);HeCheng = Image;R_HeCheng = HeCheng(:,:,1);G_HeCheng = HeCheng(:,:,2);B_HeCheng = HeCheng(:,:,3);% 计算月亮所处坐标[n,m] = size(mImgDxy);for i = 1:nfor j = 1:mif mImgDxy(i,j) == 1hang = i;breakendendif mImgDxy(i,j) == 1breakendendfor j = 1:mfor i = 1:nif mImgDxy(i,j) == 1lie = j;breakendendif mImgDxy(i,j) == 1breakendend% 通过三个通道合成[n,m] = size(logo);for i = 1:nfor j = 1:162R_HeCheng(i+hang-1,j+lie-1) = R_HeCheng(i+hang-1,j+lie-1) + R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_HeCheng(i+hang-1,j+lie-1) + G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_HeCheng(i+hang-1,j+lie-1) + B_logo(i,j);endendHeCheng = cat(3,R_HeCheng,G_HeCheng,B_HeCheng);figure;imshow(HeCheng);title('合成图像');% 通过三个通道覆盖for i = 1:nfor j = 1:162if logo(i,j) == 0 R_HeCheng(i+hang-1,j+lie-1) = R_HeCheng(i+hang-1,j+lie-1) + R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_HeCheng(i+hang-1,j+lie-1) + G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_HeCheng(i+hang-1,j+lie-1) + B_logo(i,j);elseR_HeCheng(i+hang-1,j+lie-1) = R_logo(i,j);G_HeCheng(i+hang-1,j+lie-1) = G_logo(i,j);B_HeCheng(i+hang-1,j+lie-1) = B_logo(i,j);endendendFuGai = cat(3,R_HeCheng,G_HeCheng,B_HeCheng);figure;imshow(FuGai);title('覆盖图像');

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。