2019-09-22 11:06:35 ytkml2016 阅读数 166
  • OpenGL ES2.0 中级篇

    巩固OpenGL ES2.0,增加了场景控制,shader光照计算,光照的多种模型,shader雾化计算 shader法线贴图的计算,shader Cartoon效果实现,以及Spline,曲线的实现,应用中实现路径动画。

    16581 人正在学习 去看看 张立铜

 

眼底图像分析需要首先获取ROI 感兴趣区,这样在后续的处理中能有效避免ROI 区域外的像素的影响,降低运算的复杂度。

一般选取彩色眼底图像最能反映光照情况的红色通道灰度图进行处理,包括两步:阈值处理和形态学腐蚀操作

我们用彩色眼底图像的红色通道做了mask 掩膜图,得到满意的结果。

代码如下:

#从目录下读取彩色眼底图,

img_ori = cv2.imread('./dataset/1.jpg')

#调整到图像统一尺寸

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

#分离出红色通道

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

#对红色通道图进行CLAHE 处理

clahe = cv2.createCLAHE(cliplimt=2.0,titleGrideSize=(8,8))

img_clahe_red = clahe.apply(r)

# 获得 红色通道的掩膜图

img_red_mask = get_redmask(img_clahe_red)

#保存掩膜图

cv2.imwrite('./mask/1_mask.png',img_red_mask )

----------下面是掩膜图处理函数 --------------

def get_redmask(img_red):

# 采用红色通道的阈值为 10 过滤非 ROI区 , 即取图像最大亮度区200~255 之间的 5%

ret, img_threshold = cv2.threshold(img_red,10,255,cv.THRESH_BINARY)

#创建 半径为 3 的圆形结构元素做kernel

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))

# 对 ROI 区进行腐蚀运算

img_erode = cv2.erode(img_threshold, kernel, iterations=1)

# 对显示结果 

cv2.imshow('redm', img_erode)

#返回 结果

return img_erode

2019-10-21 21:40:44 qq_44669578 阅读数 57
  • OpenGL ES2.0 中级篇

    巩固OpenGL ES2.0,增加了场景控制,shader光照计算,光照的多种模型,shader雾化计算 shader法线贴图的计算,shader Cartoon效果实现,以及Spline,曲线的实现,应用中实现路径动画。

    16581 人正在学习 去看看 张立铜

检测移动的目标

1、差分图法

1、对图像进行去噪处理:因为每个输入的视频都会因为自然振动,光照变化或者摄像头本身的原因而产生噪声,对噪声进行平滑是为了避免在运动和跟踪时将其检测出来,

2、以第一帧为背景,计算帧与帧之间的差异,(差分图)。cv2.absdiff()

3、对差分图进行二值化处理,转化为黑白图像,cv2.threshold()

                                  

4、膨胀处理,对有孔和缺陷的图像进行归一化处理

                                                                

5、找出轮廓(白色斑点),并在原图中画出轮廓对应的位置

代码如下:

import cv2
import numpy as np

camera = cv2.VideoCapture("../images/camera3.flv")

es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(9,4))
kernel = np.ones((5,5),np.uint8)

background = None

while True:
    ret,frame = camera.read()

    # 将第一针画面设为背景
    if background is None:
        background = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        background = cv2.GaussianBlur(background,(21,21),0)
        continue

    gray_frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    gray_frame = cv2.GaussianBlur(gray_frame,(21,21),0)

    # 计算背景和帧之间的差异
    diff = cv2.absdiff(background,gray_frame)
    diff = cv2.threshold(diff,25,255,cv2.THRESH_BINARY)[1]
    diff = cv2.dilate(diff,es,iterations=5)
    img,cnts,hie = cv2.findContours(diff.copy(),
                                    cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    for c in cnts:
        if cv2.contourArea(c) < 1500:
            continue

        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

    cv2.imshow("contours",frame)
    cv2.imshow("diff",diff)
    if cv2.waitKey(1) != -1:
        break

cv2.destroyAllWindows()
camera.release()

2、MOG2背景分割器

opencv提供一个称为BackgroundSubtractor的类,非常便于分割前景和背景。他是一个功能齐全的类,该类不仅执行背景分割,而且能够通过机器学习的方法提高背景检测的效果,并且提供分类结果保存到文件的功能。包括KNN,MOG2,GMG。

BackgroundSubtractor类是专门用于视频分析的,该类会对视频的每一帧进行学习,可以按时间推移的方法提高运动分析的结果。

另一个基本特征是可以计算阴影,这对于精确读取视频是非常重要的,通过检测阴影,可以排除图像的阴影区域,从而关注实际特征,这就很少出现合并不需要对象的情况。阴影检测并非绝对完美,但是有助于将目标轮廓按原始形状进行还原。

import cv2
import numpy as np

cap = cv2.VideoCapture("../images/camera3.flv")
mog = cv2.createBackgroundSubtractorKNN(detectShadows=True)

while True:
    ret,frame = cap.read()
    # 可以理解为差分图
    fgmask = mog.apply(frame)
    cv2.imshow("frame",fgmask)
    if cv2.waitKey(1) != -1:
        break

cap.release()
cv2.destroyAllWindows()

3、KNN实现运动检测(与mog2类似)

knn  ---》   二值化处理   ---》   膨胀(改善缺陷)   ---》   画出轮廓

代码如下:

import cv2
import numpy as np

knn = cv2.createBackgroundSubtractorKNN(detectShadows=True)
cap = cv2.VideoCapture("../images/camera1.avi")

while True:
    ret,frame = cap.read()
    fgmask= knn.apply(frame)
    th = cv2.threshold(fgmask.copy(), 0, 255, cv2.THRESH_BINARY)[1]
    dilated = cv2.dilate(fgmask,
                         cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)),
                         iterations= 2)
    img,cnts,hie = cv2.findContours(dilated.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    for c in cnts:
        if cv2.contourArea(c) < 1500:
            continue

        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)

    cv2.imshow("knn-detect",frame)
    cv2.imshow("mask",fgmask)
    cv2.imshow("thresh",th)
    if cv2.waitKey(1) != -1:
        break

cap.release()
cv2.destroyAllWindows()

 

2017-10-11 11:30:21 fu18946764506 阅读数 3075
  • OpenGL ES2.0 中级篇

    巩固OpenGL ES2.0,增加了场景控制,shader光照计算,光照的多种模型,shader雾化计算 shader法线贴图的计算,shader Cartoon效果实现,以及Spline,曲线的实现,应用中实现路径动画。

    16581 人正在学习 去看看 张立铜
//该代码实现白平衡算法中的灰度世界法,能有效改善图像发红发蓝发绿的现象;
  
 #include <opencv2/opencv.hpp>
 using namespace cv;
 
 int main()
 {
      Mat g_srcImage,dstImage;
     vector<Mat> g_vChannels;
    g_srcImage = imread("C:/Users/Administrator/Desktop/区分高架定位/01.jpg");
     imshow("原图",g_srcImage);
     //waitKey(0);
 
     //分离通道
     split(g_srcImage,g_vChannels);
     Mat imageBlueChannel = g_vChannels.at(0);
     Mat imageGreenChannel = g_vChannels.at(1);     
    Mat imageRedChannel = g_vChannels.at(2);
 
     double imageBlueChannelAvg=0;
     double imageGreenChannelAvg=0;
     double imageRedChannelAvg=0;
 
     //求各通道的平均值
     imageBlueChannelAvg = mean(imageBlueChannel)[0];
     imageGreenChannelAvg = mean(imageGreenChannel)[0];
     imageRedChannelAvg = mean(imageRedChannel)[0];
 
     //求出个通道所占增益
     double K = (imageRedChannelAvg+imageGreenChannelAvg+imageRedChannelAvg)/3;
     double Kb = K/imageBlueChannelAvg;
     double Kg = K/imageGreenChannelAvg;
     double Kr = K/imageRedChannelAvg;
 
     //更新白平衡后的各通道BGR值
     addWeighted(imageBlueChannel,Kb,0,0,0,imageBlueChannel);
     addWeighted(imageGreenChannel,Kg,0,0,0,imageGreenChannel);
     addWeighted(imageRedChannel,Kr,0,0,0,imageRedChannel);
 
     merge(g_vChannels,dstImage);//图像各通道合并
     imshow("白平衡后图",dstImage);
     waitKey(0);
    return 0;
 }


2019-01-08 15:38:06 WilsonAir 阅读数 91
  • OpenGL ES2.0 中级篇

    巩固OpenGL ES2.0,增加了场景控制,shader光照计算,光照的多种模型,shader雾化计算 shader法线贴图的计算,shader Cartoon效果实现,以及Spline,曲线的实现,应用中实现路径动画。

    16581 人正在学习 去看看 张立铜

 

1、OpenCV官方文档

HSV将色彩饱和度与明度分开,对光照相关的处理十分有用

cv::COLOR_BGR2HSV 针对的是8位图像

cv::COLOR_BGR2HSV_FULL 针对的是16位以及更高的图像

Lab 将亮度,

See also

cv::COLOR_BGR2Labcv::COLOR_RGB2Labcv::COLOR_Lab2BGRcv::COLOR_Lab2RGB

2019-10-24 15:35:57 cool_grubby 阅读数 98
  • OpenGL ES2.0 中级篇

    巩固OpenGL ES2.0,增加了场景控制,shader光照计算,光照的多种模型,shader雾化计算 shader法线贴图的计算,shader Cartoon效果实现,以及Spline,曲线的实现,应用中实现路径动画。

    16581 人正在学习 去看看 张立铜

以下均为github上opencv的个人学习笔记,原路径如下:

https://github.com/JimmyHHua/opencv_tutorials

源码示例:

import cv2 as cv 
import numpy as np

src = cv.imread("C:/Users/Mark/Desktop/CV/opencv_tutorials-master/opencv_tutorials-master/python/code_011/test.png")
cv.namedWindow("input",cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

#转换为浮点数类型数组
gray = np.float32(gray)
print(gray)

#scale and shift by NORM_MINMAX
dst = np.zeros(gray.shape,dtype = np.float32)
cv.normalize(gray, dst=dst, alpha=0, beta=1.0,norm_type=cv.NORM_MINMAX)
print(dst)
cv.imshow("NORM_MINMAX", np.uint8(dst*255))

#scale and shift by NORM_INF
dst1 = np.zeros(gray.shape,dtype=np.float32)
cv.normalize(gray,dst=dst1,alpha=1.0,beta=0,norm_type=cv.NORM_INF)
print(dst1)
cv.imshow("NORM_INF", np.uint8(dst1*255))

#scale and shift by NORM_L1
dst2 = np.zeros(gray.shape,dtype = np.float32)
cv.normalize(gray,dst=dst2,alpha=1.0,beta=0,norm_type=cv.NORM_L1)
print(dst2)
cv.imshow("NORM_L1", np.uint8(dst2*10000000))

#scale and shift by NORM_L2
dst3 = np.zeros(gray.shape,dtype = np.float32)
cv.normalize(gray,dst=dst3,alpha=1.0,beta=0,norm_type=cv.NORM_L2)
print(dst3)
cv.imshow("NORM_L2", np.uint8(dst3*10000))

cv.waitKey(0)
cv.destroyAllWindows()

这里用到了cv.normalize函数,用来进行图像像素值归一化

1. 归一化
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

首先归一化是为了后面数据处理的方便,其次是保证程序运行时收敛加快。归一化的具体作用是归纳统一样本的统计分布性。归一化在0-1之间是统计的概率分布,归一化在某个区间上是统计的坐标分布。归一化有同一、统一和合一的意思。

归一化的目的,是使得没有可比性的数据变得具有可比性,同时又保持相比较的两个数据之间的相对关系,如大小关系;或是为了作图,原来很难在一张图上作出来,归一化后就可以很方便的给出图上的相对位置等。


2. opencv中的归一化函数normalize()
opencv文档中的介绍如下:

C++: void normalize(InputArray src, InputOutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() )
C++: void normalize(const SparseMat& src, SparseMat& dst, double alpha, int normType)
Python: cv2.normalize(src[, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]]) → dst
Parameters:    
src – input array.
dst – output array of the same size as src .
alpha – norm value to normalize to or the lower range boundary in case of the range normalization.
beta – upper range boundary in case of the range normalization; it is not used for the norm normalization.
normType – normalization type (see the details below).
dtype – when negative, the output array has the same type as src; otherwise, it has the same number of channels as src and the depth =CV_MAT_DEPTH(dtype).
mask – optional operation mask.

The functions normalize scale and shift the input array elements so that

                                                                                       

(where p=Inf, 1 or 2) when normType=NORM_INF, NORM_L1, or NORM_L2, respectively; or so that

                                                                    

when normType=NORM_MINMAX (for dense arrays only). The optional mask specifies a sub-array to be normalized. This means that the norm or min-n-max are calculated over the sub-array, and then this sub-array is modified to be normalized. If you want to only use the mask to calculate the norm or min-max but modify the whole array, you can use norm() and Mat::convertTo().

In case of sparse matrices, only the non-zero values are analyzed and transformed. Because of this, the range transformation for sparse matrices is not allowed since it can shift the zero level.

从上面可以看出,opencv提供了四种不同的归一化方式,分别为NORM_INF, NORM_MINMAX,NORM_L1和NORM_L2。下面分别解释一下各自代表的含义及归一化公式。

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化。

比如归一化到(min,max)范围内:

NORM_INF: 归一化数组的(切比雪夫距离)L∞范数(绝对值的最大值)

NORM_L1 :  归一化数组的(曼哈顿距离)L1-范数(绝对值的和)

NORM_L2: 归一化数组的(欧几里德距离)L2-范数

而其中的dtype为负数时,输出数组的type与输入数组的type相同;

否则,输出数组与输入数组只是通道数相同,而tpye=CV_MAT_DEPTH(dtype).

原文链接:https://blog.csdn.net/kuweicai/article/details/78988886

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