积分图像、图像分割、Harris角点检测

目录

1、积分图像

2、图像分割--漫水填充

3、图像分割--分水岭法

4、Harris角点检测


1、积分图像

 

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

//积分图像
int test()
{
	//创建一个16×16全为1的矩阵,因为256=16×16
	Mat img = Mat::ones(16, 16, CV_32FC1);
	//在图像中加入随机噪声
	RNG rng(10086);
	for (int y = 0; y < img.rows; y++)
	{
		for (int x = 0; x < img.cols; x++)
		{
			float d = rng.uniform(-0.5, 0.5);
			//使用.at的形式读出x,y位置像素来进行操作
			img.at<float>(y, x) = img.at<float>(y, x) + d;
		}
	}
	//计算标准求和积分
	Mat sum;
	integral(img, sum);
	//为了便于显示,转成CV_8U格式
	Mat sum8U = Mat_<uchar>(sum);
	namedWindow("sum8U", WINDOW_NORMAL);
	imshow("sum8U", sum8U);

	//计算平方求和积分
	Mat sqsum;
	integral(img, sum, sqsum);
	//为了便于显示,转成CV_8U格式
	Mat sqsum8U = Mat_<uchar>(sqsum);
	namedWindow("sqsum8U", WINDOW_NORMAL);
	imshow("sqsum8U", sqsum8U);

	//计算倾斜求和积分
	Mat tilted;
	integral(img, sum, sqsum, tilted);
	//为了便于显示,转成CV_8U格式
	Mat tilted8U = Mat_<uchar>(tilted);
	namedWindow("tilted8U", WINDOW_NORMAL);
	imshow("tilted8U", tilted8U);

	waitKey(0);
	return 0;
}
int main()
{
	test();

	system("pause");
	return 0;
}

2、图像分割--漫水填充

 

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


//图像分割--漫水填充
int test()
{
	system("color 02");
	Mat img = imread("E:/testMap/lena.png");
	if (!(img.data))
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	RNG rng(10086);//随机数,用于随机生成像素

	//设置操作标志flags
	int connectivity = 4;//连通邻域方式
	int maskVal = 255;//掩码图像的数值
	int flags = connectivity | (maskVal << 8) | FLOODFILL_FIXED_RANGE;//漫水填充操作方式标志

	//设置与选中像素点的差值
	Scalar loDiff = Scalar(20, 20, 20);
	Scalar upDiff = Scalar(20, 20, 20);

	//声明掩模矩阵变量,尺寸比输入图像宽高各大2
	Mat mask = Mat::zeros(img.rows + 2, img.cols + 2, CV_8UC1);

	while (true)
	{
		//随机产生图像中某一像素点
		int py = rng.uniform(0, img.rows - 1);
		int px = rng.uniform(0, img.cols - 1);
		Point point = Point(px, py);

		//彩色图像中填充的像素值
		Scalar newVal = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));

		//漫水填充函数
		int area = floodFill(img, mask, point, newVal, &Rect(), loDiff, upDiff, flags);

		//输出像素点和填充的像素数目
		cout << "像素点x: " << point.x << " y : " << point.y << "填充像素数目:" << area << endl;

		//输出填充的图像结果
		imshow("填充的彩色图像", img);
		imshow("掩模图像", mask);

		//判断是否结束程序
		int c = waitKey();
		if ((c & 255) == 27)
		{
			break;
		}
	}
	waitKey(0);
	return 0;
}
int main()
{
	test();

	system("pause");
	return 0;
}

3、图像分割--分水岭法

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

//图像分割--分水岭法
int test()
{
	Mat img, imgGray, imgMask, img_;
	Mat maskWaterShed; //watershed()函数的参数

	img = imread("E:/testMap/lenaw.png"); //含有标记的图像
	img_ = imread("E:/testMap/lena.png"); //原图像
	cvtColor(img, imgGray, COLOR_BGR2GRAY);

	threshold(imgGray, imgMask, 235, 255, THRESH_BINARY);//二值化
	Mat k = getStructuringElement(0, Size(3, 3));//生成结构元素
	morphologyEx(imgMask, imgMask, MORPH_OPEN, k);//开运算
	imshow("含有标记的图像", img);
	imshow("原图像", img_);

	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;//轮廓索引编号
	findContours(imgMask, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

	//在maskWaterShed上绘制轮廓,用于输入分水岭算法
	maskWaterShed = Mat::zeros(imgMask.size(), CV_32S);
	for (int index = 0; index < contours.size(); index++)
	{
		//其中第一个参数image表示目标图像,第二个参数contours表示输入的轮廓组,每一组轮廓由点vector构成,
		//第三个参数contourIdx指明画第几个轮廓,如果该参数为负值,则画全部轮廓,第四个参数color为轮廓的颜色,
		//第五个参数thickness为轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部,第六个参数lineType为线型,
		//第七个参数为轮廓结构信息,	第八个参数为maxLevel
		drawContours(maskWaterShed, contours, index, Scalar::all(index + 1), -1, 8, hierarchy, INT_MAX);
	}
	//分水岭算法需要对原图像进行处理
	watershed(img_, maskWaterShed);

	vector<Vec3b> colors;// 随机生成几种颜色
	for (int i = 0; i < contours.size(); i++)
	{
		int b = theRNG().uniform(0, 255);
		int g = theRNG().uniform(0, 255);
		int r = theRNG().uniform(0, 255);
		colors.push_back(Vec3b((uchar)b, (uchar)g, (uchar)r));
	}

	Mat resultImg = Mat(img.size(), CV_8UC3); // 显示图像
	for (int i = 0; i < imgMask.rows; i++)
	{
		for (int j = 0; j < imgMask.cols; j++)
		{
			//绘制每个区域的颜色
			int index = maskWaterShed.at<int>(i, j);
			if (index == -1)//区域间的值被置为 - 1(边界)
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
			}
			else if (index <= 0 || index > contours.size())//没有标记清楚的区域被置为0
			{
				resultImg.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
			}
			else//其他每个区域的值保持不变: 1,2,…,contours.size()
			{
				resultImg.at<Vec3b>(i, j) = colors[index - 1];//把些区域绘制成不同颜色
			}
		}
	}
	imshow("resultImg", resultImg);
	resultImg = resultImg * 0.8 + img_*0.2;
	//addWeighted(resultImg,0.8,img_, 0.2,0, resultImg); 
	imshow("分水岭结果", resultImg);

	//绘制每个区域的图像
	for (int n = 1; n <= contours.size(); n++)
	{
		Mat resImagel = Mat(img.size(), CV_8UC3);//声明一个最后要显示的图像
		for (int i = 0; i < imgMask.rows; i++)
		{
			for (int j = 0; j < imgMask.cols; j++)
			{
				int index = maskWaterShed.at<int>(i, j);
				if (index == n)
					resImagel.at<Vec3b>(i, j) = img_.at<Vec3b>(i, j);
				else
					resImagel.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
			}
		}
		//显示图像
		imshow(to_string(n), resImagel);
	}

	waitKey(0);
	return 0;
}

int main()
{
	test();

	system("pause");
	return 0;
}

4、Harris角点检测

 

 

 

 

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

//Harris角点检测
int test()
{
	Mat img = imread("E:/testMap/lena.png", IMREAD_COLOR);
	if (!img.data)
	{
		cout << "读取图像错误,请确认图像文件是否正确" << endl;
		return -1;
	}
	//转成灰度图像
	Mat gray;
	cvtColor(img, gray, COLOR_BGR2GRAY);

	//计算Harris系数
	Mat harris;
	int blockSize = 2; //邻域半径
	int apertureSize = 3;
	cornerHarris(gray, harris, blockSize, apertureSize, 0.04);//角点检测

	//归一化便于进行数值比较和结果显示
	Mat harrisn;
	normalize(harris, harrisn, 0, 255, NORM_MINMAX);
	//将图像的数据类型变成CV_8U
	convertScaleAbs(harrisn, harrisn);

	//寻找Harris角点
	vector<KeyPoint> keyPoints;
	for (int row = 0; row < harrisn.rows; row++)
	{
		for (int col = 0; col < harrisn.cols; col++)
		{
			int R = harrisn.at<uchar>(row, col);
			if (R >125)
			{
				//向角点存入KeyPoint中
				KeyPoint keyPoint;
				keyPoint.pt.y = row;
				keyPoint.pt.x = col;
				keyPoints.push_back(keyPoint);
			}
		}
	}
	//绘制角点与显示结果
	drawKeypoints(img, keyPoints, img);
	imshow("系数矩阵", harrisn);
	imshow("Harris角点", img);

	waitKey(0);
	return 0;
}

int main()
{
	test();

	system("pause");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Harris角点检测是一种计算机视觉算法,用于检测图像中的角点。以下是Harris角点检测的Python代码: 1. 首先需要导入必要的库: ``` from PIL import Image from numpy import * from pylab import * ``` 2. 定义计算Harris响应函数的函数: ``` def compute_harris_response(im, sigma=3): """ 在一幅灰度图像中,对每个像素计算Harris角点检测器响应函数 """ # 计算导数 imx = zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (0,1), imx) imy = zeros(im.shape) filters.gaussian_filter(im, (sigma,sigma), (1,0), imy) # 计算Harris矩阵的分量 Wxx = filters.gaussian_filter(imx*imx, sigma) Wxy = filters.gaussian_filter(imx*imy, sigma) Wyy = filters.gaussian_filter(imy*imy, sigma) # 计算特征值和迹 Wdet = Wxx*Wyy - Wxy**2 Wtr = Wxx + Wyy return Wdet / Wtr ``` 3. 定义获取Harris角点的函数: ``` def get_harris_points(harrisim, min_distance=10, threshold=0.1): """ 从一幅Harris响应图像中返回角点。min_distance为分割角点和图像边界的最小像素数目 """ # 寻找高于阈值的候选角点 corner_threshold = harrisim.max() * threshold harrisim_t = (harrisim > corner_threshold) * 1 # 得到候选点的坐标 coords = array(harrisim_t.nonzero()).T # 以及它们的Harris响应值 candidate_values = [harrisim[c[0],c[1]] for c in coords] # 对候选点按照Harris响应值进行排序 index = argsort(candidate_values) # 将可行点的位置保存到数组中 allowed_locations = zeros(harrisim.shape) allowed_locations[min_distance:-min_distance,min_distance:-min_distance] = 1 # 按照最小距离原则,选择最佳Harris点 filtered_coords = [] for i in index: if allowed_locations[coords[i,0],coords[i,1]] == 1: filtered_coords.append(coords[i]) allowed_locations[(coords[i,0]-min_distance):(coords[i,0]+min_distance), (coords[i,1]-min_distance):(coords[i,1]+min_distance)] = 0 return filtered_coords ``` 4. 定义绘制Harris角点的函数: ``` def plot_harris_points(image, filtered_coords): """ 绘制图像中检测到的角点 """ figure() gray() imshow(image) plot([p[1] for p in filtered_coords], [p[0] for p in filtered_coords], '*', color='r') axis('off') show() ``` 5. 最后,可以使用以下代码来运行Harris角点检测: ``` # 读入图像 im = array(Image.open(r"C:\Users\13121\Desktop\test.jpg").convert('L')) # 计算Harris响应函数 harrisim = compute_harris_response(im) # 获取Harris角点 filtered_coords = get_harris_points(harrisim, 6, 0.01) # 绘制Harris角点 plot_harris_points(im, filtered_coords) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值