2008年6月28日 星期六

OpenCV隨機的實作-圖形,矩陣點座標隨機交換

這個隨機是很特殊的隨機,cvRandShuffle()他會將圖片或矩陣點的位置隨機重排,這邊主要是用在分群演算法的應用,運用隨機交換的方式將矩陣座標的位置隨機重排.

RandShuffle的使用
#include <cv.h>
#include <highgui.h>


int main()
{
    IplImage *Image1,*Image2;
    Image1=cvLoadImage("bicycle.jpg",1);
    Image2=cvCloneImage(Image1);

    CvRNG rng;
    rng = cvRNG(cvGetTickCount());

    double IterFactor=0.1;

    cvRandShuffle(Image2,&rng,IterFactor);

    cvNamedWindow("Bicycle",1);
    cvShowImage("Bicycle",Image1);
    cvNamedWindow("Bicycle Rand Shuffle",1);
    cvShowImage("Bicycle Rand Shuffle",Image2);
    cvWaitKey(0);
}
圖片:


執行結果:
(1)IterFactor=0.1

(把圖片放大,其實有雜訊的)
(2)IterFactor=1

(隨機了640*480次,但仍看的到影像輪廓)

用出來的結果很像胡椒鹽雜訊(Salt-and-peper noise),但實際上不是,cvRandShuffle()的第三個參數放的是交換數,為double型別,可以用小數去代替,這邊用0.1,原圖影像為640*480則它隨機交換的次數是640*480*0.1,IterFactor大於1以上圖片就很難辨識清楚了,因為它幾乎所有點都被交換過了(640*480*1),不過他選定交換的點是隨機的,所以用1的話仍然可以看的見圖形模糊的輪廓.這邊他交換的是R+G+B的像素值(pixel),也就是說他會依照圖片的格式做座標的交換,不用擔心它交換的只是一個單一的數值.

cvRandShuffle()
將CvMat矩陣或IplImage圖片做隨機座標交換,隨機交換的個數由第三個參數來做決定.第三個參數為長*寬*IterFactor的結果.
cvRandShuffle(CvMat或IplImage資料結構,CvRNG資料結構,交換的比率參數)



0 意見:

Copyright 2008-2009,yester