图像处理之局部二值特征

一:局部二值模式(LBP)介绍
局部二值模式(Local Binary Pattern)主要用来实现2D图像纹理分析。其基本思想是用每个像素跟它周围的像素相比较得到局部图像结构,假设中心像素值大于相邻像素值则则相邻像素点赋值为1,否则赋值为0,最终对每个像素点都会得到一个二进制八位的表示,比如11100111。假设3x3的窗口大小,这样对每个像素点来说组合得到的像素值的空间为[0~2^8]。这种结果我称为图像的局部二值模式或者简写为了LBP。

二:局部二值模式(LBP)扩展
对于这种固定窗口大小方式的局部二值模式,很多人很快就发现它的弊端,不能很好的反映出图像结构,于是高人纷纷上阵把它改为窗口大小可变,而且把矩形结构改成圆形结构。而且还总结出来如下一系列的典型结构单元:

该操作是基于原来的局部二值模式的扩展,所以又被称为扩展的局部二值模式。但是一旦改为圆形的时候,寻找八个点坐标可能会产生小数坐标,这个时候就需要通过插值方式产生该像素点的像素值,最常见的插值方式基于双线性插值。这样就完成了任意尺度上的局部二值模式的采样。

三:运行
输入图像与3x3默认的LBP运行结果如下:

在扩展模式下半径分别为1、3、5、7时候的运行结果:

四:代码实现 - 基于OpenCV实现
简单说一下步骤
1. 读入图像
2. 彩色图像转灰度
3. 默认LBP处理操作
4. 扩展LBP处理操作
完整的源代码如下:

#include <opencv2/opencv.hpp>
#include <iostream>
#include "math.h"using namespace cv;
using namespace std;int max_thresh = 20;
int current_radius = 5;
Mat gray_src, LBP_image, ELBP_image;
void Demo_ELBP(int, void*);
int main(int argc, char** argv) {Mat src, dst;src = imread("D:/vcprojects/images/cat.jpg");if (src.empty()) {printf("could not load image...\n");return -1;}const char* output_tt = "LBP Result";namedWindow("input image", CV_WINDOW_AUTOSIZE);namedWindow(output_tt, CV_WINDOW_AUTOSIZE);imshow("input image", src);// convert to graycvtColor(src, gray_src, COLOR_BGR2GRAY);int width = gray_src.cols;int height = gray_src.rows;// default LBP imageLBP_image = Mat::zeros(src.rows - 2, src.cols - 2, CV_8UC1);for (int row = 1; row < height-1; row++) {for (int col = 1; col < width-1; col++) {uchar center = gray_src.at<uchar>(row, col);uchar code = 0;code |= (gray_src.at<uchar>(row - 1, col - 1) > center) << 7;code |= (gray_src.at<uchar>(row - 1, col) > center) << 6;code |= (gray_src.at<uchar>(row - 1, col + 1) > center) << 5;code |= (gray_src.at<uchar>(row, col + 1) > center) << 4;code |= (gray_src.at<uchar>(row+ 1, col + 1) > center) << 3;code |= (gray_src.at<uchar>(row + 1, col) > center) << 2;code |= (gray_src.at<uchar>(row + 1, col - 1) > center) << 1;code |= (gray_src.at<uchar>(row, col - 1) > center) << 0;LBP_image.at<uchar>(row- 1, col - 1) = code;}}imshow(output_tt, LBP_image);// extend LBP namedWindow("ELBP_Result", CV_WINDOW_AUTOSIZE);createTrackbar("Radius:", "ELBP_Result", &current_radius, max_thresh, Demo_ELBP);Demo_ELBP(0, 0);waitKey(0);return 0;
}void Demo_ELBP(int, void*) {int offset = current_radius * 2;ELBP_image = Mat::zeros(gray_src.rows - offset, gray_src.cols - offset, CV_8UC1);int height = gray_src.rows;int width = gray_src.cols;int neighbors = 8;for (int n = 0; n<neighbors; n++) {// sample pointsfloat x = static_cast<float>(current_radius) * cos(2.0*CV_PI*n / static_cast<float>(neighbors));float y = static_cast<float>(current_radius) * -sin(2.0*CV_PI*n / static_cast<float>(neighbors));// relative indicesint fx = static_cast<int>(floor(x));int fy = static_cast<int>(floor(y));int cx = static_cast<int>(ceil(x));int cy = static_cast<int>(ceil(y));// fractional partfloat ty = y - fy;float tx = x - fx;// set interpolation weightsfloat w1 = (1 - tx) * (1 - ty);float w2 = tx  * (1 - ty);float w3 = (1 - tx) *      ty;float w4 = tx  *      ty;// iterate through your datafor (int i = current_radius; i < gray_src.rows - current_radius; i++) {for (int j = current_radius; j < gray_src.cols - current_radius; j++) {float t = w1*gray_src.at<uchar>(i + fy, j + fx) + w2*gray_src.at<uchar>(i + fy, j + cx) + w3*gray_src.at<uchar>(i + cy, j + fx) + w4*gray_src.at<uchar>(i + cy, j + cx);// we are dealing with floating point precision, so add some little toleranceELBP_image.at<uchar>(i - current_radius, j - current_radius) += ((t > gray_src.at<uchar>(i, j)) && (abs(t - gray_src.at<uchar>(i, j)) > std::numeric_limits<float>::epsilon())) << n;}}}imshow("ELBP_Result", ELBP_image);
}

请继续关注本博客,同时关注微信公众号【OpenCV学堂】定期推送更多干货,图像处理算法!

图像处理之局部二值特征相关推荐

  1. matlab lbp直方图特征多少维,LBP局部二值特征

    最近一直在看LBP的东西,就说说LBP吧.先从最基本的LBP说起,LBP的全称是Local Binary Pattern即局部二值模式,是局部信息提取中的一种方法.目前LBP有很多应用,如人脸识别,表 ...

  2. Opencv全局二值化和局部二值化(python实现)

    文章目录 1.前置知识 (1).什么是形态学处理 (2).形态学图像处理 2.二值化 (1)全局二值化 1)函数 2)阈值类型 3)代码实战 (2)局部二值化(自适应阈值) 1)函数 2)阈值类型 1 ...

  3. LBP(局部二值模式)特征提取原理

    1.前言 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik ...

  4. 局部二值模式LBP的详细理解

    局部二值模式LBP的噶几详细的理解 一个电脑小白的自我成长之路,总是这么的寂寞.孤独.无聊,却充满新奇.艰难,唯有坚韧不拔,持续奋斗,才可披荆斩棘.登临云端.各位看官们:"咋的,能不能上干货 ...

  5. 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性

    Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...

  6. 计算机视觉基础-图像处理(图像分割/二值化)cpp+python

    5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...

  7. 计算机视觉基础-图像处理 Task05 图像分割/二值化

    文章目录 OSTU二值化 自适应阈值 函数实现 OSTU二值化 自适应阈值 图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技 ...

  8. 【医学图像处理】9 二值形态学

    形态学及二值操作 1 形态学相关概念 2 二值形态学操作 2.1 二值膨胀 2.2 二值腐蚀 2.3 二值开操作 2.4 二值闭操作 2.5 二值形态学总结 3 二值形态学应用 1 形态学相关概念   ...

  9. 特征提取算法——LBP(Local Binary Pattern)局部二值模式学习笔记

    在上Computer Vision lecture的时候,讲师介绍了LBP算子,这里对他进行简单的介绍. LBP(Local Binary Pattern) 局部二制模式,是描述图像局部纹理特征的算子 ...

  10. 图像处理中的二值化和灰度化

    图像的灰度化: 灰度是指只含亮度信息,不含色彩信息的图像.黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的.要表示灰度图,就需要把亮度值进行量化 使用灰度图的好处: ① RGB的值都一样. ② 图 ...

最新文章

  1. BP神经网络的线性本质的理解和剖析-卷积小白的随机世界
  2. java arraystoreexception_208道高频 Java面试题答案6
  3. MySQL中地理位置数据扩展geometry的使用心得
  4. .net连接mysql数据_.net连接MYSQL数据库 转载
  5. oracle数据提交不上去,oracle数据库命令窗口执行了语句但是没有提交会有什么影响吗...
  6. SAP FSM 学习笔记(一) : 使用API消费FSM的数据
  7. 前端攻略系列(二) - 前端各种面试题
  8. AE 新建项目(一)(持续更新,做到哪算哪)
  9. inner join 和join的区别_left join、right join和join ???
  10. 数博会重磅活动:第二届大数据科学与工程国际会议日程
  11. arcgis如何打开tif_实例|ArcGiS导出的dxf,在CASS中如何变身?
  12. 2021年中国电动辅助电动机市场趋势报告、技术动态创新及2027年市场预测
  13. 论文笔记_S2D.37_2015-TPAMI_使用深度卷积神经场从单目图像学习深度
  14. 华为官方解锁工具_渣男为何爱用华为手机?
  15. Module ‘/src/components/HelloWorld.vue“‘ has no default export.Vetur(1192)
  16. win10 磁盘管理 压缩卷 无法启动问题
  17. 登录界面---油管大佬
  18. android view.isshown,源码解析view的显示判断用isShown()还是View.VISIBLE
  19. 万物互联背景下的边缘计算安全需求与挑战
  20. 2015年ps计算机试题,2015年3月全国计算机一级考试ps模拟试题及答案(二).doc

热门文章

  1. GARFIELD@10-21-2004
  2. 灰度世界算法(Gray World Algorithm)
  3. 智能优化算法:基于梯度的优化算法-附代码
  4. arcgis 导入Excel坐标数据
  5. ENVI实验教程(7)实验七、遥感影像变化检测
  6. ArcGIS 地表TIN面数据的符号化
  7. ArcGIS操作小技巧(七)之制作漂亮的萤火虫图
  8. 利用composer搭建PHP框架(二.控制器)
  9. vm驱动程序版本不正确_微软 Win10 版本 2004 获得新版 Intel/Nvidia 显卡驱动程序
  10. Python爬虫基础-02-提取数据