opencv应用——以图拼图

前几天,我发现了一个巨牛的人工智能学习网站。它易于理解、有趣和幽默。忍不住分享给大家:点击跳转[0]

content

1. Prepare the picture[0]

Second, the puzzle[0]

Three, optimization ideas[0]

1. Prepare the picture

可以先手动分点,有的关键信息在中间,有的在上面,主要是这两个。

然后先用程序剪出正方形的图片:

int main()
{
	for (int i = 1; i <= 10; i++) {
		Mat img = imread("D:/pic2/img (" + to_string(i) + ").jpg",0);
		int p = min(img.rows, img.cols);
		Mat img2 = img(Rect((img.cols - p) / 2, (img.rows - p) / 2, p, p));
		imwrite("D:/pic2/a" + to_string(i) + ".jpg",img2);
	}
	return 0;
}

Snip the above:

int main()
{
	for (int i = 1; i <= 15; i++) {
		Mat img = imread("D:/pic2/img (" + to_string(i) + ").jpg",0);
		int p = min(img.rows, img.cols);
		Mat img2 = img(Rect(0, 0, p, p));
		imwrite("D:/pic2/a" + to_string(i) + ".jpg",img2);
	}
	return 0;
}

Second, the puzzle

我们首先将所有缩略图调整为统一大小,然后按亮度对它们进行排序。

对于目标图像,根据块,亮度也是单独排序的。

然后根据排序结果进行匹配,并将缩略图填充到相应的位置。

除了画面的亮度匹配外,在最后的画面拼到大画面上之前,要先调整好亮度,把整体亮度调整到与块亮度一致。

struct Nodes
{
	int t;
	int id;
	bool operator(i, j);
	return s;
}

int main()
{
	const int N = 9;
	const int NUM = N * N;
	const int SIZE = N * 2000;
	const int PIX = 100;
	const int R1 = SIZE / PIX;
	const int R = R1 / N * R1 / N;
	Mat imgs[NUM];
	for (int i = 1; i <= NUM; i++) {
		imgs[i - 1] = imread("D:/pic2/img (" + to_string(i) + ").jpg", 0);
		resize(imgs[i - 1], imgs[i - 1], Size(PIX, PIX));
	}
	Mat img = imread("D:/pic2/img (74).jpg", 0);
	resize(img, img, Size(SIZE, SIZE));
	Nodes node[NUM * R];
	Nodes node2[NUM * R];
	for (int i = 0; i < NUM * R; i++) {
		node[i].t = imageSum(imgs[i % NUM]);
		node[i].id = i % NUM;
		node2[i].t = imageSum(img(Rect(i % R1 * PIX, i / R1 * PIX, PIX, PIX)));
		node2[i].id = i;
	}
	sort(node, node + NUM * R);
	sort(node2, node2 + NUM * R);
	for (int i = 0; i < NUM * R; i++)
	{
		Mat image;
		imgs[node[i].id % NUM].copyTo(image);
		image *= 1.0 * node2[i].t / node[i].t;
		image.copyTo(img(Rect(node2[i].id % R1 * PIX, node2[i].id / R1 * PIX, PIX, PIX)));
	}
	//imshow("img", img);
	imwrite("D:/pic2/ans.png", img);
	cv::waitKey(0);
	return 0;
}

Splicing result:

(Head) zoom effect:

(eye) zoom effect:

Three, optimization ideas

1,当前所用图片较少,如果图片多一点,效果会好一点。

2,因为图片少,每个图片都被用到多次。当前是每个图片被使用的次数相同,这一点可以优化一下,自适应的选择每个图片被使用的次数,效果应该会更好。

3,要想搞成彩色的,主要问题在于图片的匹配问题。灰度图像只需要按照亮度排序即可匹配,改成彩色图像相当于从一维变成三维。

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
上一篇 2022年4月25日 下午10:22
下一篇 2022年4月25日 下午11:06

相关推荐