これは、円筒形のカメラから長方形のウィンドウを使って撮影した画像です。我々が得する画像は、円形でなければならないが、長方形の画像である。私はOpenCVを使用して、イメージをピクセル単位で、指定された長方形の画像から1行ずつ円に移動します。問題は、ピクセルの分布が半径によって不均一であることです。より均等に流通させるためにどのようなアルゴリズムを提案しますか?ここでは、コードです:OpenCVでピクセル単位で画像を整形する
int main(int argc, char** argv) {
Mat src = imread("srcImg.jpg", 1);
Mat dst = imread("dstImg.jpg", 1);
int srcH = src.rows; int srcW = src.cols;
int dstH = dst.rows; int dstW = src.cols;
//convert chamber radius to pixels
double alpha, alpha_double, alpha_triple;
int r = 1500;
double k = 210/(500 * PI);
int l = 1;
//take pixels from source and arrange them into circles
for (int i = srcH - 1; i > 0; i--) {
for (int j = 1; j <= srcW ; j++) {
alpha = (double) (2 * PI * (r * k + i))/j;
alpha_double = (double) (2 * PI * ((r + 15) * k + i))/j;
alpha_triple = alpha_double = (double) (2 * PI * ((r + 30) * k + i))/j;
int x_new = abs((int) (dstW/2 - (r * k + i) * cos(alpha)) - 200);
int y_new = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha))) + 1000);
int x_new_double = abs((int) (dstW/2 - (r * k + i) * cos(alpha_double)) - 200);
int y_new_double = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha_double))) + 1000);
int x_new_triple = abs((int) (dstW/2 - (r * k + i) * cos(alpha_triple)) - 200);
int y_new_triple = abs((int) (dstH/2 - (3.5*(r * k + i) * sin(alpha_triple))) + 1000);
dst.at<uchar>(x_new, y_new) = src.at<uchar>(srcH - i, srcW - j);
dst.at<uchar>(x_new_double, y_new_double) = src.at<uchar>(srcH - i, srcW - j);
dst.at<uchar>(x_new_triple, y_new_triple) = src.at<uchar>(srcH - i, srcW - j);
}
}
//make dst image grey and show all images
Mat dstGray;
cvtColor(dst, dstGray, CV_RGB2GRAY);
imshow("Source", src);
imshow("Result", dstGray);
waitKey();
return 0;
達成したい循環的な結果はもう少し説明できますか?同様に、なぜ、何がポイントで、何を期待しているのですか? – Eric
通常、あなたはその逆を行います。ターゲットイメージ内のすべてのピクセルについて、ソースイメージ内の値を計算する必要があります。サブピクセルの位置を計算すると、あなたの心の欲求に補間技術を適用することもできます。 – PeterT
@エリック円筒形のカメラとその周りを走る爆発波があります。小さな矩形の窓を通してビデオに取り込み、ビデオのフレームを1つのピクチャに接続して、カメラ内のすべての瞬間の長いイメージを取得します。私たちが得する画像は長方形ですが、波が入っているカメラは円ですので、波形を正しく表現できるように、指定した半径の円に合わせるために長方形の画像を作成する必要があります。単純にピクセルのすべての線を取り、円を描く必要があります。私は元の画像をリンクしてより明確になるようにします[リンク](https://s3.postimg.org/6gdezqppf/src_Img.jpg) –