# 利用Matlab處理圖片 ## 運用Matlab程式將圖片轉接灰階與壓縮。 matlab程式: ``` cpp= a=imread('s:\Wang.jpg');//讀檔 graya=rgb2gray(a);//轉灰階 imshow(graya);//顯示圖片 b=imresize(graya,1/20);//縮小二十倍 rom=fopen('C:\Users\ray11\Downloads\rom.txt','wt');//寫入記事本('位置') //寫入內容 for m=1:6 //圖片高 fprintf(rom,'%d:case(x)\n',m-1); for y=1:8 //圖片長 fprintf(rom,'%d:data=8''d%d;\n',y,b(m,y)); end fprintf(rom,'default:data=0;\n endcase\n'); end ``` 顯示結果: ![](https://i.imgur.com/Arm6Gm0.png =80%x) --- ## 運用Matlab程式將圖片加入雜訊。 參考網址:https://ww2.mathworks.cn/help/images/ref/imnoise.html#d124e34598 ```cpp= J = imnoise(I,'gaussian') 将方差为 0.01 的零均值高斯白噪声添加到灰度图像 I。 J = imnoise(I,'gaussian',m) 添加高斯白噪声,均值为 m,方差为 0.01。 J = imnoise(I,'gaussian',m,var_gauss) 添加高斯白噪声,均值为 m,方差为 var_gauss。 J = imnoise(I,'localvar',var_local) 添加局部方差为 var_local 的零均值高斯白噪声。 J = imnoise(I,'localvar',intensity_map,var_local) 添加零均值高斯白噪声。噪声的局部方差 var_local 是 I 中图像强度值的函数。图像强度值到噪声方差的映射由向量 intensity_map 指定。 J = imnoise(I,'poisson') 从数据中生成泊松噪声,而不是向数据中添加人为噪声。有关详细信息,请参阅算法。 J = imnoise(I,'salt & pepper') 添加椒盐噪声,默认噪声密度为 0.05。这会影响大约 5% 的像素。 示例 J = imnoise(I,'salt & pepper',d) 添加椒盐噪声,其中 d 是噪声密度。这会影响大约 d*numel(I) 个像素。 J = imnoise(I,'speckle') 使用方程 J = I+n*I 添加乘性噪声,其中 n 是均值为 0、方差为 0.05 的均匀分布随机噪声。 J = imnoise(I,'speckle',var_speckle) 添加方差为 var_speckle 的乘性噪声。 ``` ### 實作將圖片加入雜訊 ``` cpp= >> a=imread('s:\Wang.jpg');//讀檔 >> graya=rgb2gray(a);//轉灰階 >> imshow(graya);//顯示圖片 >> b=imresize(graya,1/20);//縮小二十倍 >> noisb = imnoise(b,'salt & pepper',0.08);//將圖片b加入胡椒鹽雜訊,後面為要加入的密度 >> rom=fopen('C:\Users\ray11\Downloads\rom.txt','wt');//寫入記事本('位置') //寫入內容 >> for m=1:6 //圖片高 fprintf(rom,'%d:case(x)\n',m-1); for y=1:8 //圖片長 fprintf(rom,'%d:data=8''d%d;\n',y,nois(m,y)); end fprintf(rom,'default:data=0;\n endcase\n'); end ``` ### 結果: 原圖 加入胡椒鹽的原圖 ![](https://i.imgur.com/8fjQ7p8.png =80%x) 像素值 ![](https://i.imgur.com/twNMbr8.png) 記事本資料 ![](https://i.imgur.com/X7pRZhb.png =80%x) --- ## 運用Matlab程式將圖片自訂位置剪貼 先將特定的範圍進行減下,之後建立一張全黑的圖片將減下的部分貼至全黑圖片上。 ``` cpp= %裁減頭部位置 img = imread('D:\myimage2.png'); % Specify the position of the crop x = 170; % x-coordinate of top-left corner of crop y = 150; % y-coordinate of top-left corner of crop width = 60; % width of the crop height = 60; % height of the crop % Crop the image using the specified position cropped_img = img(y:y+height-1, x:x+width-1, :); % Display the original and cropped images side-by-side subplot(1,3,1); imshow(img); title('Original Image'); subplot(1,3,2); imshow(cropped_img); title('Cropped Image'); subplot(1,3,3); imshow(background); title('Finsh Image'); %save the cropped image imwrite(cropped_img, 'D:\cropped_image.jpg'); %貼至黑色照片上 cropped_img = imread('cropped_image.jpg'); % Create a black image of size 416x416 background = zeros(416, 416, 3, 'uint8'); % Calculate the position to paste the cropped image x = 1; % x-coordinate of top-left corner of crop on background y = 1; % y-coordinate of top-left corner of crop on background % Paste the cropped image onto the background background(y:y+size(cropped_img,1)-1, x:x+size(cropped_img,2)-1, :) = cropped_img; %save the cropped image imwrite(background, 'D:\finsh_image.jpg'); ``` ### 結果: ![](https://i.imgur.com/sm26dOq.png) ## 將彩色圖片分別提出R,G,B ``` cpp= image = imread('D:\lena_std.tif'); [height, width, channels] = size(image); gray_image = rgb2gray(image); for y = 1:height for x = 1:width red = image(y, x, 1); green = image(y, x, 2); blue = image(y, x, 3); % do something with the pixel values end end //red red_channel = image(:,:,1); green_channel = zeros(height, width, 'uint8'); blue_channel = zeros(height, width, 'uint8'); red_image = cat(3, red_channel, green_channel, blue_channel); //green red_channe2 = zeros(height, width, 'uint8'); green_channe2 = image(:,:,1); blue_channe2 = zeros(height, width, 'uint8'); green_image = cat(3, red_channe2, green_channe2, blue_channe2); //blue red_channe3 = zeros(height, width, 'uint8'); green_channe3 = zeros(height, width, 'uint8'); blue_channe3 = image(:,:,1); blue_image = cat(3, red_channe3, green_channe3, blue_channe3); //gray gray_image2 = (red_image + green_image + blue_image) /3; //show subplot(1,4,1);imshow(red_image);title('Red'); subplot(1,4,2);imshow(green_image);title('Green'); subplot(1,4,3);imshow(blue_image);title('Blue'); subplot(1,4,4);imshow(gray_image2);title('Gray'); ``` ### 結果: ![](https://i.imgur.com/RGGRF12.png) ## 練習 寫一個Lenabit_108xxx.m Lena 圖轉成灰階後,依照 bit 切成8個 bit 的圖層.用 subplot (4, 2, *) 把 8 層存成一張圖 Lenabit_108xxx.jpg 把 NKUST 的 logo 改成 512*512 二值化(黑白圖), 放到 Lena 的第8及第1bit, 存成Lena_logo8.jpg 及Lena_logo1.jpg 並寫一個 PSNR 程式, 計算Lena_logo8 及 Lena_logo1跟原Lena灰階的 PSNR 值. . ```cpp= myimage = imread('D:\lena_std.tif'); myimage_gray = rgb2gray(myimage); watermark = imread('D:\watermark.jpg'); watermark_gray = rgb2gray(watermark); msb_1 = bitshift(myimage_gray, -7); msb_2 = bitshift(myimage_gray, -6); msb_3 = bitshift(myimage_gray, -5); msb_4 = bitshift(myimage_gray, -4); msb_5 = bitshift(myimage_gray, -3); msb_6 = bitshift(myimage_gray, -2); msb_7 = bitshift(myimage_gray, -1); msb_8 = bitshift(myimage_gray, 0); msb_image1 = logical(msb_1); %msb_image2 = logical(msb_2); %msb_image3 = logical(msb_3); %msb_image4 = logical(msb_4); %msb_image5 = logical(msb_5); %msb_image6 = logical(msb_6); %msb_image7 = logical(msb_7); msb_image8 = logical(msb_8); % 設定浮水印的透明度 alpha = 0.2; % 調整浮水印大小與原圖相同 %watermark_gray = imresize(watermark_gray, size(msb_1, 1:2)); % 在原圖上加上浮水印 watermarked_img1 = imlincomb(1, msb_1, alpha, watermark_gray); watermarked_img2 = imlincomb(1, msb_8, alpha, watermark_gray); Lena_logo1 = bitor(bitor(bitor(bitor(bitor(bitor(bitor(watermarked_img1, msb_2), msb_3), msb_4), msb_5), msb_6), msb_7), msb_8); Lena_logo8 = bitor(bitor(bitor(bitor(bitor(bitor(bitor(watermarked_img1, msb_2), msb_3), msb_4), msb_5), msb_6), msb_7), watermarked_img2); %PSNR1 img1 = im2double(Lena_logo1); img2 = im2double(Lena_logo8); img3 = im2double(gray_image); % 計算 PSNR (Peak Signal-to-Noise Ratio) max_pixel_value = 1.0; % 計算 MSE (Mean Squared Error) mse = mean((img3(:) - img1(:)).^2); psnr = 10 * log10((max_pixel_value^2) / mse); %PSNR8 % 計算 MSE (Mean Squared Error) mse8 = mean((img3(:) - img2(:)).^2); psnr8 = 10 * log10((max_pixel_value^2) / mse8); % 顯示 PSNR 值 fprintf('The PSNR between the Lena_logo1 and gray_image is %.2f dB.\n', psnr); % 顯示 PSNR 值 fprintf('The PSNR between the Lena_logo8 and gray_image is %.2f dB.\n', psnr8); subplot(2,2,1); imshow(Lena_logo1); subplot(2,2,2); imshow(Lena_logo8); subplot(2,2,3); imshow(gray_image); title('合并后的灰度图像'); ``` ### 結果: ![](https://i.imgur.com/nRqOPar.png)