画像操作、及び画素コントラスト変換の動作 - 0から戦闘OpenCVのN(3)〜

クリエイティブコモンズライセンス 著作権:帰属、紙ベースを作成するために他人を許可し、(同じライセンスで元のライセンス契約に基づいて用紙配布する必要がありますクリエイティブコモンズ

画像操作、及び画素コントラスト変換の動作 - 0から戦闘OpenCVのN(3)〜

図1は、OpenCVのは、以下の加算を実行するために使用される機能、サブトラクション画像の一部を提供します。

void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);

void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);

void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);

void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);

void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);

void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

同様に、ビット操作機能があります。

void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());

void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray());

一般的に使用される差分演算は、2枚の画像の画素の絶対値です。

void absdiff(InputArray src1, InputArray src2, OutputArray dst);

機能の一部は、単一の画像を操作している、例えば、各画素、平方根の対数の値を二乗。

void sqrt(InputArray src, OutputArray dst);

void pow(InputArray src, double power, OutputArray dst);

void exp(InputArray src, OutputArray dst);

void log(InputArray src, OutputArray dst);

図2に示すように、画像の画素の動作:


int height = src.rows; // 图像高度

int width = src.cols; // 图像宽度(像素为单位)

int step = src.step; // 相邻行的同列点之间的字节数

int channels = src.channels(); // 颜色通道数目 (1,2,3,4)

uchar *data = (uchar *)src.data;



for (int i = 0; i != height; ++i)

    {

        for (int j = 0; j != width; ++j)

        {
    
            for (int k = 0; k != channels; ++k)

            {


                data[i*step + j*channels + k] = 255;


            }

        }

}

または:

for (int i = 0;i < src.rows;i++)

{

    uchar* current_src = src.ptr< uchar>(i);

    uchar* current_dst = dst.ptr< uchar>(i);

    for (int j = 0;j < src.cols;j++)

    {


        if (current_src[j]==0)

        {

        current_dst[j] = 255;

        }


    }

}





 

図3は、画像の明るさを変化させる、コントラスト比は、一般的に使用される:ヒストグラム等化、指数変換、対数変換。

変換の例は、インデックスの下に与えられています。


int gammm(Mat& src,double g, Mat& dst)

{

    Mat table,d;

    for (int i = 0;i < 256;i++)

    {

        table.push_back((int)(255*pow(i / 255.0, g)));

        //cout << (int)(255 * pow(i / 255.0, g)) << " ,";

     }

        LUT(src,table,d); //查表

        d.convertTo(dst,CV_8U);

    return 0;

}

gammm(img, 0.5, dst);

マイクロチャンネル公衆番号にもっと注意:ML_Study

おすすめ

転載: blog.csdn.net/qq_34106574/article/details/93769633