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);
}
效果和上面是一样的,如下所示:
基于最小值的降采样方法实现起来还是比较简单的,但是却很有用的,一般可作为图像的预处理部分。程序是之前项目的一个小部分,故特此总结和大家分享!