2017-05-22 17:08:53 wujiahui1207 阅读数 477
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4258 人正在学习 去看看 贾志刚

OpenCV中程序的模板

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

在OpenCV中,灰度图像的存储示意图

这里写图片描述

彩色图像的存储示意图,在OpenCV中彩色图像的颜色存储顺序为蓝,绿,红(BGR)

这里写图片描述

Mat常用的构造函数

Mat::Mat()
Mat::Mat(int rows, int cols, int type)
Mat::Mat(Size size, int type)
Mat::Mat(int rows, int cols, int type, const Scalar& s)
Mat::Mat(Size size, int type, const Scalar& s)
Mat::Mat(const Mat& m)
Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)
Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)
Mat::Mat(const Mat& m, const Rect& roi)
//构造函数创建图像
Mat M(2,2,CV_8UC3);
//释放内存重新创建图像
M.create(3,2,CV_8UC2);

OpenCV深拷贝和浅拷贝的问题

这里写图片描述

遍历图像(几种像素值得读写)
方法1

//灰度图像
uchar value=grayim.at<uchar>(i,j);
for(int i=0;igrayim.rows;++i)
   for(int j=0;j<grayim.cols;++j)
      grayim.at<uchar>(i,j)=(i+j)%255;
//彩色图像
for(int i=0;i<colorim.rows;++i)
   for(int j=0;j<colorim.cols;++j)
   {
      Vec3b pixel;
      pixel[0]=i%255;  //Blue
      pixel[1]=j%255;  //Green
      pixel[2]=0;  //Red
      colorim.at<Vec3b>(i,j)=pixel;
   }

这里写图片描述

方法2(迭代器)

//灰度图像
cv::Mat Iterator_<uchar> grayit, grayend;
for( grayit = grayim.begin<uchar>(), grayend = grayim.end<uchar>(); grayit != grayend; ++grayit)
    *grayit = rand()%255;
//彩色图像
cv::Mat Iterator_<Vec3b> colorit,colorend;
for(colorit=colorim.begin<Vec3b>(),colorend=colorim.end<Vec3b>();colorit!=colorend;++colorit)
{
    (*colorit)[0]=rand()%255;  //Blue
    (*colorit)[1]=rand()%255;  //Green
    (*colorit)[2]=rand()%255;  //Red
}

方法3

for( int i = 0; i < grayim.rows; ++i)
{
    //获取第 i 行首像素指针
    uchar * p = grayim.ptr<uchar>(i);
    //对第 i 行的每个像素(byte)操作
    for( int j = 0; j < grayim.cols; ++j )
         p[j] = (i+j)%255;
}

方法4(step)
二维数据

这里写图片描述

三维数据

这里写图片描述

addr(Mi0,i1,…im-1) = M.data + M.step[0] * i0 + M.step[1] * i1 + … +M.step[m-1] * im-1 (其中 m = M.dims M的维度)

int main()
{
    //新建一个uchar类型的单通道矩阵(grayscale image 灰度图)
    Mat m(400, 400, CV_8U, Scalar(0));
    for (int col = 0; col < 400; col++)
    {
        for (int row = 195; row < 205; row++)
        {
            cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << "==>";
            //获取第[row,col]个像素点的地址并用*符号解析
            *(m.data + m.step[0] * row + m.step[1] * col) = 255;
            cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl;
        }
    }
    imshow("binary image", m);
    cvWaitKey();
    return 0;
}

上述代码结果图

int main()
{
    Mat m = imread("lena.jpg");
    Vec3i color;
    for (int col = 20; col < 40; col++)
        for (int row = 5; row < 25; row++)
        {
            color[0] = (int)(*(m.data + m.step[0] * row + m.step[1] * col));
            color[1] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()));
            color[2] = (int)(*(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2));
            //获取第[row,col]个像素点的地址并用*符号解析
            cout << color[0] << "," << color[1] << "," << color[2] << "==>";
            color[0] = 255;
            color[1] = 0;
            color[2] = 0;
            *(m.data + m.step[0] * row + m.step[1] * col) = color[0];
            *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1()) = color[1];
            *(m.data + m.step[0] * row + m.step[1] * col + m.elemSize1() * 2) = color[2];
            cout << (int)*(m.data + m.step[0] * row + m.step[1] * col) <<
                (int)*(m.data + m.step[0] * row + m.step[1] * col + 1) <<
                (int)*(m.data + m.step[0] * row + m.step[1] * col + 2) << endl;
        }
    imshow("lena", m);
    cvWaitKey();
    return 0;
}

上述代码结果图

方法5(Mat_类)

Mat M(600, 800, CV_8UC1);
for (int i = 0; i < M.rows; ++i)
{
    uchar * p = M.ptr<uchar>(i);
    for (int j = 0; j < M.cols; ++j)
    {
        double d1 = (double)((i + j) % 255);
        M.at<uchar>(i, j) = d1;
        double d2 = M.at<double>(i, j);
    }
}
Mat_<uchar> M1 = (Mat_<uchar>&)M;
for (int i = 0; i < M1.rows; ++i)
{
    uchar * p = M1.ptr(i);
    for (int j = 0; j < M1.cols; ++j)
    {
        double d1 = (double)((i + j) % 255);
        M1(i, j) = d1;
        double d2 = M1(i, j);
    }
}
int main()
{
Mat m = imread("lena.jpg");
    Mat_<Vec3b>m2 = m;
    //for循环画一个蓝色的实心圆
    for (int y = 21; y < 42; y++)
        for (int x = 2; x < 21; x++)
        {
            if (pow(double(x - 11), 2) + pow(double(y - 31), 2) - 64 < 0.0000000001)
            {
                //Mat_模板类实现了对()的重载,可以定位到一个像素
                m2(x, y) = Vec3b(255, 0, 0);
            }
        }
    imshow("CircleImage", m2);
    cvWaitKey();
    return 0;
}

这里写图片描述

方法6

int divideWith=10;
uchar table[256];
for (int i = 0; i < 256; ++i)
    table[i] = divideWith* (i/divideWith); //量化
Mat lookUpTable(1, 256, CV_8U);
uchar* p = lookUpTable.data;
for( int i = 0; i < 256; ++i)
    p[i] = table[i];
LUT(I, lookUpTable, Out);

学习OpenCV必备资料

这里写图片描述

手册:http://docs.opencv.org/
教程:http://docs.opencv.org/2.4/doc/tutorials/tutorials.html
进阶:http://github.com/opencv/opencv/wiki
在OpenCV安装目录下build->doc->opencv_tutorials.pdf 为学习教程

2019-02-28 15:29:07 qq_39267907 阅读数 101
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4258 人正在学习 去看看 贾志刚

OpenCV图像处理

1 下载、保存、显示

最基础的操作,不做介绍,直接放代码

import cv2

gray_img = cv2.imread('images/input.jpg', cv2.IMREAD_GRAYSCALE)   # 下载(读入图像)

cv2.imshow('Grayscale', gray_img)     # 显示

cv2.imwrite('images/output.jpg', gray_img)     # 保存

cv2.waitKey()
其中,cv2.IMREAD_GRAYSCALE表示以灰度图读入,其它还有很多形式,见官方文档。

2 图像的基本操作

包括移动(translation)、旋转(rotation)、调整尺寸(resizing)、翻转(flipping)、裁剪(cropping)还有图像算术、按位操作、掩蔽、分裂和合并通道(后面这些之后再分章节论述)。

移动:

import cv2
import numpy as np

img = cv2.imread('images/input.jpg')
num_rows, num_cols = img.shape[:2]

translation_matrix = np.float32([ [1,0,70], [0,1,110] ])
img_translation = cv2.warpAffine(img, translation_matrix, (num_cols + 70, num_rows + 110))
translation_matrix = np.float32([ [1,0,-30], [0,1,-50] ])
img_translation = cv2.warpAffine(img_translation, translation_matrix, (num_cols + 70 + 30, num_rows + 110 + 50))

cv2.imshow('Translation', img_translation)
cv2.waitKey()

效果:

旋转:

rotation_matrix = cv2.getRotationMatrix2D((num_cols/2, num_rows/2), 30,0.7)

img_rotation = cv2.warpAffine(img, rotation_matrix, (num_cols, num_rows))

未具体写的程序同上,主要中心代码给出。

效果:

调整尺寸:

img_scaled = cv2.resize(img,None,fx=1.2, fy=1.2, interpolation = cv2.INTER_LINEAR)

或者写成:

img_scaled = cv2.resize(img,(450, 400), interpolation = cv2.INTER_AREA)

其中,interpolation可见官方文档介绍。

翻转:

# 水平翻转
flipped = cv2.flip(image, 1)

# 垂直翻转
flipped = cv2.flip(image, 0)

裁剪:

img = image[85:250, 85:220]

这是最最最最最基本的操作,后面会有形态学操作、卷积操作、平滑与模糊、边缘检测等。

 

2019-02-19 10:32:55 gqixf 阅读数 81
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4258 人正在学习 去看看 贾志刚
Python-Opencv 图像处理基本操作(一) 
一开始需要import

import cv2
import os
1
2
##########################################
# 读入图片,默认为BGR顺序,读出的变量img类型为uint8, size为(height,width,3)
img = cv2.imread(os.path.join('images', '000906' + '.jpg'))

#读入灰度图片,参数为0,默认为1,读入彩色图片
grayImg = cv2.imread(os.path.join('images', '000906' + '.jpg'), 0) 

#显示图片,“Image”为图像窗口名称,img为图像变量,后面要加一句waitKey()
cv2.imshow("Image", img)
cv2.waitKey()
cv2.destroyAllWindows() 

#保存图片,第一个参数为保存路径和保存名称,这里为images/12.jpg,第二个参数为需要保存的图像变量
cv2.imwrite(os.path.join('images', '12' + '.jpg'), img)

#输出 (height,width,3),如果是灰度图像为 (height,width)
print img.shape

#输出 height
print img.shape[0]

#输出 width
print img.shape[1]  

#输出通道数,彩色图像为3,灰度图像报错,shape没有第三个参数,只有(height,width)
print img.shape[2]  

#输出 height×width×3 ,灰度图像输出 height×width
print img.size 

#输出 uint8                  
print img.dtype 

##########################################
#缩放图像,有两种形式

img_resized = cv2.resize(img, (width,height), interpolation = cv2.INTER_CUBIC) 

img_resized = cv2.resize(img, None, fx = 1.0, fy = 0.5, interpolation = cv2.INTER_CUBIC) 

#第一种形式直接输入缩放后图像的大小,注意形式是(width,height) 
#第二种形式在输入缩放系数,在缩放系数之前加上None,fx代表列方向(宽度)的缩放系数,fy代表行方向(高度)的缩放系数

#最后的系数interpolation可以选择:

#CV_INTER_NN - 最近邻插值,  

#CV_INTER_LINEAR - 双线性插值 (缺省使用)  

#CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..  

#CV_INTER_CUBIC - 立方插值.               

##########################################

#图像通道的拆分与合并

#拆分

b,g,r = cv2.split(img)

#或者是

b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]

#合并

img_merge = cv2.merge((b,g,r)) 

##########################################

#画直线, 第二三个参数指的是直线的起始点,点坐标第一个值是列值,第二个是行值,第三个参数是颜色,顺序bgr,下面的是红色,最后一个参数是宽度

cv2.line(img,(start.column,start.row),(end.column,end.row),(0,0,255),2) 

#画矩形,第二三个参数指的是矩形左上角点和右下角点,点坐标第一个值是列值,第二个是行值,第三个参数是颜色,顺序bgr,下面的是蓝色,最后一个参数是宽度

cv2.rectangle(img,(start.column,start.row),(end.column,end.row),(255,0,0),2)

#显示出来

cv2.imshow("Image", img)

cv2.waitKey(0)
cv2.destroyAllWindows() 

##########################################

#读取图像最大值,和最大值索引

img_b = img[:,:,0] #img_b 大小为(height,width)   

aa = img_b.max(0) # 按列取最大值,大小为(width,),每个值代表每一列的最大像素值

#aa[:, np.newaxis]可把大小由(width,)变为(width,1)

bb = img_b.argmax(0) # 按列取最大值所在位置,大小为(width,),每个值代表每一列的最大像素值所在的位置

cc = img_b.max(1) # 按行取最大值,大小为(height,),每个值代表每一行的最大像素值

dd = img_b.argmax(1) # 按行取最大值所在位置,大小为(height,),每个值代表每一行的最大像素值所在的位置

img.max() #取三通道中最大的像素值,是一个数值

img.max(0) #按列取每个通道的最大值,大小为(width,3)

img.max(1) #按行取每个通道的最大值,大小为(height,3)
--------------------- 
作者:残月飞雪 
来源:CSDN 
原文:https://blog.csdn.net/majinlei121/article/details/78933922 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

2019-02-28 21:17:37 qq_39267907 阅读数 98
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4258 人正在学习 去看看 贾志刚

OpenCV图像处理

1 边缘检测

Sobel

 由于边缘可以出现在水平和垂直两个方向,所以Sobel滤波器由以下两个内核组成(例如):

左边的内核检测水平边缘,右边的内核检测垂直边缘。

sobel_horizontal = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)

sobel_vertical = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)

注意:在8位输入图像的情况下,将导致截断导数,因此可以使用深度值cv2.CV_16U。 如果边缘不是很好定义的话,可以调整内核的值,为获得较薄的边缘而较小,并且为了相反的目的而重要。

效果:

Sobel滤波器可以检测水平或垂直方向的边缘,但是不会给我们提供所有边缘的整体视图。所以使用下面这个啦。

Laplacian

优点是它在两个方向上都使用双导数。

laplacian = cv2.Laplacian(img, cv2.CV_64F)

效果:

尽管拉普拉斯核心在这种情况下运行良好,但存在较多的噪音,这时候就要使用下面的啦。

Canny

canny = cv2.Canny(img, 50, 240)    #前一个参数数字为低阈值,后一个参数数字为高阈值、

效果:

怎么样,还是很不错的吧!

2 二值化

threshold阈值

效果:

(T, threshInv) = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY_INV)

(T, thresh) = cv2.threshold(blurred, 200, 255, cv2.THRESH_BINARY)

cv2.imshow("Threshold Binary Inverse", threshInv)

cv2.imshow("Threshold Binary", thresh)

cv2.imshow("Output", cv2.bitwise_and(image, image, mask=threshInv))    

这是需要手动输入阈值,也可以使用自动

threshold——otsu(自动选择阈值)

效果:

(T, threshInv) = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)

adaptive_threshold(自适应阈值)

效果:

thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, 25, 15)

或者后者

from skimage.filters import threshold_adaptive

thresh = threshold_adaptive(blurred, 29, offset=5).astype("uint8") * 255

对比图可看出,采用自适应的效果更佳哦。

好了,2月份的整理到此,至于后面的内容,让我3月份好好规划下,哈哈哈哈哈。

2019-02-28 20:38:18 qq_39267907 阅读数 106
  • OpenCV3.2 Java图像处理视频学习教程

    OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授。主要内容包括opencv像素操作、滤波、边缘提取、直线与圆检测、形态学操作与分水岭、图像金子塔融合重建、多尺度模板匹配、opencv人脸检测、OpenCV跟Tomcat使用实现服务器端图像处理服务。

    4258 人正在学习 去看看 贾志刚

OpenCV图像处理

1 形态学操作

形态学操作包括:腐蚀(erosion)、膨胀(dilation)、开(opening)、闭(closing)、形态梯度(morphological gradient)、黑帽(blackhat)和白帽(torhat)。

————代码示例省去了图像的导入、显示、保存等操作,详见上一篇博客。

腐蚀和膨胀:

kernel = np.ones((5,5), np.uint8) 
img_erosion = cv2.erode(img, kernel, iterations=1) 
img_dilation = cv2.dilate(img, kernel, iterations=1) 

效果图:

开和闭操作:

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernelSize)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

       

 

 

形态梯度:

gradient = cv2.morphologyEx(gray, cv2.MORPH_GRADIENT, kernel)

黑帽和白帽:

rectKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (13, 5))

blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, rectKernel)

tophat = cv2.morphologyEx(gray, cv2.MORPH_TOPHAT, rectKernel)

2 平滑与模糊

2D卷积操作:

卷积是图像处理中的基本操作。我们基本上将一个数学运算符应用于每个像素,并以某种方式更改其值。

为了应用这个数学运算符,我们使用另一个称为内核的矩阵。内核通常比输入图像小得多。对于图像中的每个像素,我们将内核放在最上面,以使内核的中心与所考虑的像素重合。然后,我们将核矩阵中的每个值与图像中的相应值相乘,然后将其相加。这是将应用于输出图像中此位置的新值。

代码如下,可根据需求修改核尺寸和大小,此处展示了三种不同的核的尺寸并有不同的输入方式。

kernel_identity = np.array([[0,0,0], [0,1,0], [0,0,0]])

kernel_3x3 = np.ones((3,3), np.float32) / 9.0 # 除以9用于规则化核的大小

kernel_5x5 = np.ones((5,5), np.float32) / 25.0 # 除以25用于规则化核的大小

output = cv2.filter2D(img, -1, kernel_identity)

output = cv2.filter2D(img, -1, kernel_3x3)

output = cv2.filter2D(img, -1, kernel_5x5)

效果:(

(由于选择图像不佳,效果不是很明显,自己可以调整参数,使效果更加明显)

 如果你不想自己生成内核,你可以直接使用这个函数。 

output = cv2.blur(img, (3,3))

锐化:

应用锐化滤镜将锐化图像中的边缘。 当我们想要增强不够清晰的图像边缘时,此滤镜非常有用。

kernel_sharpen_1 = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])

kernel_sharpen_2 = np.array([[1,1,1], [1,-7,1], [1,1,1]])

kernel_sharpen_3 = np.array([[-1,-1,-1,-1,-1],

                             [-1,2,2,2,-1],

                             [-1,2,8,2,-1],

                             [-1,2,2,2,-1],

                             [-1,-1,-1,-1,-1]]) / 8.0

output_1 = cv2.filter2D(img, -1, kernel_sharpen_1)

output_2 = cv2.filter2D(img, -1, kernel_sharpen_2)

output_3 = cv2.filter2D(img, -1, kernel_sharpen_3)

这是三种不同的内核,出现了三种不同的效果,如下:

Embossing(压花?浮雕?不知道怎么翻译好)

kernel_emboss_1 = np.array([[0,-1,-1],[1,0,-1],[1,1,0]])

kernel_emboss_2 = np.array([[-1,-1,0],[-1,0,1],[0,1,1]])

kernel_emboss_3 = np.array([[1,0,0],[0,0,0],[0,0,-1]])

output_1 = cv2.filter2D(gray_img, -1, kernel_emboss_1) + 128

output_2 = cv2.filter2D(gray_img, -1, kernel_emboss_2) + 128

output_3 = cv2.filter2D(gray_img, -1, kernel_emboss_3) + 128

(这里需要注意,我们的图像要是灰度图,这样才有更好的效果哦!)

之后一章将介绍二值化、边缘检测以及寻找轮廓等。

OpenCV数字图像处理基础

博文 来自: clover_daisy

opencv图像处理总结

阅读数 9017

opencv图片处理基础

阅读数 492

没有更多推荐了,返回首页