opencv 透视变换(三)打补丁 — 替换指定区域图像

17 篇文章 0 订阅
11 篇文章 0 订阅

        如图,将一个矩形图像投射到图像上某一区域。这里用到几何图像变换的透视变换。首先要计算出源图像矩形(或图像中的某一区域)与目标区域间的变换矩阵,再对源图像中区域进行透视变换,再对两幅图像进行加操作。由于处理效果像对图像加上补丁,为形象化表达这里称为打补丁。

        如果想从其他图像的一个不规则区域这里专指四边形区域图像,还可以参考本系列的“抠补丁”文章从图像中任意四边形区域中获取。

        这里参考以下资料进行学习、整理、记录,对原代码进行简单改动和注释,如用getPerspectiveTransform()函数替换findHomography()计算转换矩阵。感谢两位。

Opencv日常之Homography_adsdriver的博客-CSDN博客_homography

Homography examples using OpenCV ( Python / C ++ ) |

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

struct userdata
{
	Mat img;
	vector<Point2f> points;
};


void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
{
	if (event == EVENT_LBUTTONDOWN)
	{
		userdata* data = ((userdata*)data_ptr);
		circle(data->img, Point(x, y), 3, Scalar(0, 255, 255), 5);
		imshow("Image", data->img);
		if (data->points.size() < 4)
		{
			data->points.push_back(Point2f(x, y));
		}
	}

}

int main(int argc, char** argv)
{

	// Read in the image. 图标
	Mat img_icon = imread("outRect.jpg");

	int nrows = img_icon.rows;
	int ncols = img_icon.cols;

	Size size = img_icon.size();
	// Create a vector of points.
	vector<Point2f> src_points;
	src_points.push_back(Point2f(0, 0));
	src_points.push_back(Point2f(size.width - 1, 0));
	src_points.push_back(Point2f(size.width - 1, size.height - 1));
	src_points.push_back(Point2f(0, size.height - 1));

	// Destination image 大图
	Mat im_dst = imread("D:/show-1.jpg");

	// Set data for mouse handler
	Mat im_temp = im_dst.clone();
	userdata data;
	data.img = im_temp;


	imshow("Image", im_temp);
	cout << "Click on four corners(start from left-top to left-bottom) of a billboard and then press ENTER" << endl;
	//set the callback function for any mouse event
	setMouseCallback("Image", mouseHandler, &data);
	waitKey(0);

	// Calculate Homography between source and destination points
	Mat h = findHomography(src_points, data.points);
	warpPerspective(img_icon, im_temp, h, im_temp.size());  //把整图投射到全0大图的某一区域

	// Extract four points from mouse data
	Point pts_dst[4];
	for (int i = 0; i < 4; i++)
	{
		pts_dst[i] = data.points[i];
	}

	// Black out polygonal area in destination image.
	fillConvexPoly(im_dst, pts_dst, 4, Scalar(0));	//将图像多边形区域置零

	// Add warped source image to destination image.
	im_dst = im_dst + im_temp;

	imshow("dst", im_dst);


	waitKey(0);

	return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Python图像局部细节放大,可以使用OpenCV库。以下是一种实现方法: 1. 导入必要的库和模块,例如cv2和sys。 2. 读取图像并判断是否成功读取。 3. 指定需要放大的部分区域,可以通过裁剪图像来选择感兴趣的区域。 4. 使用双线性插值法将选定的部分区域进行放大,可以使用cv2.resize函数实现。设置放大后的大小和插值方式。 5. 将放大后的结果放置在图像指定位置,可以通过赋值操作来实现。 6. 可选:为放大的部分区域绘制边框和连线,以突出显示。 7. 展示最终的结果图像。 下面是实现局部细节放大的Python代码示例: import cv2 as cv import sys if __name__ == '__main__': # 读取图像并判断是否读取成功 img = cv.imread('tu.jpg') if img is None: print('Failed to read picture') sys.exit() # 需要放大的部分区域 part = img[300:400, 250:350] # 双线性插值法放大部分区域 mask = cv.resize(part, (300, 300), fx=0, fy=0, interpolation=cv.INTER_LINEAR) # 放大后局部图的位置 img[110:410, 570:870] = mask # 画框并连线 cv.rectangle(img, (250, 300), (350, 400), (0, 255, 0), 1) img = cv.line(img, (350, 300), (570, 110), (0, 255, 0)) img = cv.line(img, (350, 400), (570, 410), (0, 255, 0)) # 展示结果 cv.imshow('img', img) cv.waitKey(0) cv.destroyAllWindows() 注意:在代码中,你需要将'tu.jpg'替换为你实际使用的图像文件路径。此代码将选定的部分区域放大,并将结果放置在图像指定位置。你还可以根据需要调整参数来获得更好的效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [科研作图-局部图像放大效果的python实现](https://blog.csdn.net/zzu_zhong/article/details/131312317)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [python放大局部图像(画中画形式展示)](https://blog.csdn.net/qq_33687272/article/details/121363358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值