[matlab数字图像处理10]对一副图像进行二值化,ostu算法等
生活随笔
收集整理的這篇文章主要介紹了
[matlab数字图像处理10]对一副图像进行二值化,ostu算法等
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、 問題描述
對一副圖像進行二值化,ostu算法等
二、 求解思路
將圖像利用imread和rgb2gary后轉化為灰度圖像,對于直接的二值化,可使用0.5作為閾值
大津法(OTSU)是一種確定圖像二值化分割閾值的算法,由日本學者大津于1979年提出.通過設定一個閾值將圖像像素分為兩類,兩者的占比分別為p1,p2,兩者的均值分別為m1,m2,全局均值為mG,其中
通過循環255個像素得到,使得式子
有最大值,此閾值可以直接使用matlab自帶的graythesh算出。本文也嘗試利用上文的公式求出使得式子最大的閾值
三. 程序代碼
clear; clc; close all x=imread('tupian.jpeg'); subplot(3,3,1) imshow(x) title('原圖') %% 利用im2bw直接閾值二值化 T = 0.5; BW = im2bw(x,T); subplot(3,3,2) imshow(BW) title('利用im2bw直接閾值二值化') %% 手動閾值二值化 subplot(3,3,3) f=x; g=rgb2gray(f); new_g=zeros(size(g)); new_g(g>125)=1; imshow(new_g) title('手動閾值二值化') %% otsu算法 subplot(3,3,4) T_otsu=graythresh(g); p_otsu=im2bw(x,T_otsu); imshow(p_otsu) title('matlab自帶otsu') %% 手動otsu算法 subplot(3,3,5) [row,col]=size(g); [counts] = histogram(g); num=counts.Values; num=num/sum(num); max=0; kmax=0; for i=2:size(num,2)p1=sum(num(1:i));p2=1-p1;sump1=0;sump2=0;for k=1:isump1=sump1+k*num(k);endfor k=i+1:size(num,2)sump2=sump2+k*num(k);endm1=1/p1*sump1;m2=1/p2*sump2;thetasq=p1*p2*(m1-m2).^2;if thetasq>maxmax=thetasq;kmax=i;end end kmax=(kmax-1)*255/size(num,2); new_g1=zeros(size(g)); new_g1(g>kmax)=1; imshow(new_g1) title('手動閾值二值化') disp('手動計算otsu閾值') disp(kmax/255) disp('matlab自帶算法計算閾值') disp(T_otsu)四. 實驗結果
如圖所示分別為原圖,使用函數im2bw直接二值化圖像,手動利用閾值二值化圖像以及利用matlab自帶函數計算大津法(otsu)給出閾值對圖像二值化和利用手寫公式求出閾值對圖像二值化
對于該種情況的圖片,手動計算的閾值與matlab自帶的算法計算的閾值幾乎一致,在計算otsu閾值時,注意使用hist函數獲得每個像素值所占的數量。
五、實驗心得
直接對函數用二值化分割有時候會不太理想,利用otsu等算法給出的結果能得到更好的分割結果
總結
以上是生活随笔為你收集整理的[matlab数字图像处理10]对一副图像进行二值化,ostu算法等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PSP的Java环境PSPKVM 0.0
- 下一篇: 【2022】APP-IOS客户端Andr