【计算机视觉】【矿泉水瓶水位测量】--Matlab与C++实现
生活随笔
收集整理的這篇文章主要介紹了
【计算机视觉】【矿泉水瓶水位测量】--Matlab与C++实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
對(duì)水瓶水位的標(biāo)定,主要運(yùn)用二值化與檢查對(duì)比度的方法:
Matlab程序:
clc; clear all I=imread('D:\14.jpg'); G=rgb2gray(I); [a,b]=size(G); G1=histeq(G); imwrite((G),'14.1.bmp'); %%%%%%%%%%%讀取直方圖向量 H=imhist(G); %自編寫直方圖均衡化 H=H./(a*b); HH(1)=H(1); for i=2:1:256HH(i)=HH(i-1)+H(i); end HH=HH'*255; HH=round(HH); for i=1:1:afor j=1:1:bfor k=0:1:255if G(i,j)==kG(i,j)=HH(k);endendend end imwrite((G),'14.2.bmp'); G=filter2(fspecial('average',2),G);%3×3均值濾波 imwrite((G),'14.3.bmp'); %%%%%%%%%%%%%%%%%%圖像2值化 for i=1:1:afor j=1:1:bif G(i,j)<=25G(i,j)=255;elseG(i,j)=0; endend end imwrite((G),'14.4.bmp'); %%%%%%%%%%%%%%%%%%%判斷對(duì)比度 i=1; a1=500; b1=b-500; for a=a1:2:b1aa(i)=sum(G(a,:))+sum(G(a+1,:));i=i+1; end %%%%%%%%%%%%%%%%%%%相減 i=1; x=size(aa,2); for s=1:1:x-1aaa(i)=aa(s+1)-aa(s);i=i+1; end %%%%%%%%%%%%%%%%%%%找尋對(duì)比度最大處 aaa=abs(aaa); x=find(aaa==max(aaa)); xx=2*x+500; %%%%%%%%%%%%%%%%%%%找尋精確水位處(暫時(shí)隱藏) I(xx-15:xx+15,:,2:3)=0; imshow(I) imwrite((I),'14.5.bmp');C++程序
//計(jì)算灰度直方圖/// int grayCount[256]; for (int a = 0; a < 256; a++)grayCount[a] = 0; for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++){for (int grayValue = 0; grayValue<256; grayValue++)grayCount[grayValue]++;} } //直方圖均衡化 double grayCountper[256] = {}; for (int b = 0; b < 256; b++) {grayCountper[b] = grayCount[b] / (height*width);///平均 } for (int i1 = 2; i1 < 256; i1++) {grayCountper[i1] = grayCountper[i1 - 1] + grayCountper[i1]; } //計(jì)算灰度概率 int (* buff )[2448]=(int (*) [2448]) calloc (3264 * 2448, sizeof(int)); int grayCountper1[256] = {}; for (int l = 0; l<256; l++) {grayCountper1[l] = round(grayCountper[l] * 255);} for (int i2 = 0; i2<height; i2++) {for (int j1 = 0; j1<width; j1++){for (int k = 0; k<256; k++){if ( *(buf + i2*width + j1) == k){buff[i2][j1] = grayCountper1[k];}}} }//均方化賦值/ for (int i6 = 1; i6<height-1; i6++) {for (int j5 = 1; j5<width-1; j5++){ buff[i6][j5]= round((buff[i6][j5]+ buff[i6-1][j5]+ buff[i6+1][j5]+ buff[i6][j5-1]+ buff[i6][j5+1] + buff[i6+1][j5-1]+ buff[i6+1][j5+1]+ buff[i6-1][j5-1]+ buff[i6-1][j5+1])/9);} } //3×3均值濾波// for (int i3 = 0; i3<height; i3++) {for (int j2 = 0; j2<width; j2++){if ( *(buf + i3*width + j2) <=65)buff[i3][j2] = 0;elsebuff[i3][j2] =255;} }/圖像二值化/// int i4 = 0; int aa[1101] = {}; int G[1101] = {}; int G1[1101] = {}; G[0] = 0; G1[0] = 0; for (int a = 450; a <2650; a = a + 2) {for (int j3 = 0; j3 < width; j3++){G[i4] = G[i4] + buff[a][j3];G1[i4] = G1[i4] + buff[a+1][j3];}aa[i4] = G[i4] + G1[i4];i4 = i4 + 1; } 計(jì)算每?jī)尚邢袼刂迪嗉又?// int i5 = 0; int aaa[1100] = {}; for (int s = 0; s <1099; s++) {aaa[i5] = aa[s + 1] - aa[s];i5 = i5 + 1; } ///每?jī)尚邢袼睾拖鄿p// for (int s1 = 0; s1 < 1100; s1++) {aaa[s1] = abs(aaa[s1]); } int kk =20; int max = aaa[0]; int idx = 0; for (int i7 = 0; i7 <1099; i7++) {if (max<aaa[i7]){max = aaa[i7];idx = i7;} } kk = idx *2+440; ///找尋對(duì)比度(差)最大區(qū)域// for (int kk2 = kk-30; kk2 <= kk ; kk2++) {for (int kk1 = 0; kk1 < width; kk1++){*(buf + kk2*width + kk1) = 0;} }總結(jié)
以上是生活随笔為你收集整理的【计算机视觉】【矿泉水瓶水位测量】--Matlab与C++实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Shell脚本】颜色显示
- 下一篇: QOS 的基本概念