OpenCV 实现最小值降采样

在处理某些高分辨的图像时,如果直接对其原图进行操作处理,那么效率是很低下的,因此我们要在尽可能的保留图像信息的情况下,减小图像的分辨率大小,此时就需要用到图像的降采样。由于我本人之前都是在处理裂缝的图像,而裂缝一般都是属于灰度值较低的部分,因此本文采用最小值的将采样法,将裂缝信息得以完整的保留,以便后续进行分析计算。具体操作如下:

实际上如果结合OpenCV实现我们上述的功能还是挺简单的,下面我分别给出Python和c++的代码:

Python代码如下:

""" 最小值采样法Python实现 _author_ZhouJH_"""
import numpy as np
import cv2
im = cv2.imread('c:\\users\\xa\\desktop\\test.jpg',0)#读入一张灰度图
a, b = im.shape[:2]
m = int(a / 5)  # hight  #降采样后图像的长和宽,如果不能被整除理论上应该是加上边框的
n = int(b / 5)  # length  降采样为原来的1/5
""" 降采样函数,为了简单粗暴先采用列表保存降采样后的值,然后reshape """
def Downsampling(m,n):
    img = []
    for x in range(m):
        for y in range(n):
            s = im[5 * x:5 * (x + 1), 5 * y:5 * (y + 1)].min() #选取窗口中灰度值最小的那个值,作为降采样后的值
            img.append(s)
    down_img = np.array((img), np.uint8).reshape(m, n) # 将采样后的图像
    return down_img
if __name__=='__main__':
    p=Downsampling(m,n)
    cv2.imshow('1',p)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

下面这张为降采样后的裂缝图像,可以看出,图像整体变暗,但是裂缝的细节被完整的保存下来。

c++代码如下:

/*最小值采样c++实现 author_ZhouJH */
#include<iostream>
#include<opencv2/opencv.hpp>
#include <vector>
using namespace std;
using  namespace cv;
/*  对图像进行降采样  */
void Downsampling(const Mat &mat)
{
	int a = mat.rows / 5;
	int b = mat.cols / 5;//降采样后的行数和列数
	double minv = 0, maxv = 0;
	double* minp = &minv;
	double* maxp = &maxv;
	Mat m = Mat(a, b, CV_8UC1, Scalar::all(0)); //初始化
	//Mat m = mat(Rect(0, 0, b,a));//初始化
	for (int i = 0; i < (a); i++)
	{ 
		for (int j = 0; j < (b); j++)
		{
			Mat im = mat(Rect(5*j, 5*i, 5, 5));//选取图像局部,实现5*5的滑动窗口
			minMaxIdx(im, minp, maxp); //找出该区域的灰度最小值
			m.at<uchar>(i, j) = (*minp);//重新将其写入矩阵中
		}
	}
	imshow("1", m);
	waitKey(0);
}
int main()
{
	Mat img, gray;
	img = imread("c:\\users\\xa\\desktop\\test.jpg");
	cvtColor(img, gray, COLOR_RGB2GRAY);//转为灰度图
	Downsampling(gray);
}

效果和上面是一样的,如下所示:

基于最小值的降采样方法实现起来还是比较简单的,但是却很有用的,一般可作为图像的预处理部分。程序是之前项目的一个小部分,故特此总结和大家分享!

猜你喜欢

转载自blog.csdn.net/zzzzjh/article/details/82841596
今日推荐