1. 程式人生 > >常用的畫素操作演算法:影象加法、畫素混合、提取影象中的ROI

常用的畫素操作演算法:影象加法、畫素混合、提取影象中的ROI

影象可以是看成是一個多維的陣列。讀取一張圖片,可以看成是讀入了一系列的畫素內容。這些畫素內容,按照不同的模式具有不同的格式。對於三通道的 RGB 點陣圖來說,每個畫素是一個 8-bit 整數的三元組。影象的畫素操作是比較基礎的影象演算法,下面列舉三個常用的畫素操作演算法。

影象加法

影象的加法表示兩個輸入影象在同一位置上的畫素相加,得到一個輸出影象的過程。

  1.        imageProcessor =Operator.add(imageProcessor1,imageProcessor2);

  2. if(imageProcessor!=null){

  3.            CV4JImage resultCV4JImage

    =new CV4JImage(imageProcessor.getWidth(), imageProcessor.getHeight(), imageProcessor.getPixels());

  4.            result.setImageBitmap(resultCV4JImage.getProcessor().getImage().toBitmap());

  5. }

Operator的add表示矩陣加法,有一個要求兩個影象必須大小一致。

  1. publicstaticImageProcessor add(ImageProcessor image1,ImageProcessor image2){

  2. if

    (!checkParams(image1, image2)){

  3. returnnull;

  4. }

  5. int channels = image1.getChannels();

  6. int w = image1.getWidth();

  7. int h = image1.getHeight();

  8. ImageProcessor dst =(channels ==3)?newColorProcessor(w, h):newByteProcessor(w, h);

  9. int size = w*h;

  10. int a=0, b=0;

  11. int c=0;

  12. for(int i=0; i<size; i++){

  13. for(int n=0; n<channels

    ; n++){

  14.                a = image1.toByte(n)[i]&0xff;

  15.                b = image2.toByte(n)[i]&0xff;

  16.                c =Tools.clamp(a + b);

  17.                dst.toByte(n)[i]=(byte)c;

  18. }

  19. }

  20. return dst;

  21. }

在實際工作中,可以通過一張原圖和一個mask影象來相加合成一些不規則的效果圖片。

畫素混合

在這裡混合是線性混合,跟之前的影象加法有一定的區別。

  1.        imageProcessor =Operator.addWeight(imageProcessor1,2.0f,imageProcessor2,1.0f,4);

  2. if(imageProcessor!=null){

  3.            CV4JImage resultCV4JImage =new CV4JImage(imageProcessor.getWidth(), imageProcessor.getHeight(), imageProcessor.getPixels());

  4.            result.setImageBitmap(resultCV4JImage.getProcessor().getImage().toBitmap());

  5. }