图像处理之局部二值特征
图像处理之局部二值特征
一:局部二值模式(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", ¤t_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学堂】定期推送更多干货,图像处理算法!
图像处理之局部二值特征相关推荐
- matlab lbp直方图特征多少维,LBP局部二值特征
最近一直在看LBP的东西,就说说LBP吧.先从最基本的LBP说起,LBP的全称是Local Binary Pattern即局部二值模式,是局部信息提取中的一种方法.目前LBP有很多应用,如人脸识别,表 ...
- Opencv全局二值化和局部二值化(python实现)
文章目录 1.前置知识 (1).什么是形态学处理 (2).形态学图像处理 2.二值化 (1)全局二值化 1)函数 2)阈值类型 3)代码实战 (2)局部二值化(自适应阈值) 1)函数 2)阈值类型 1 ...
- LBP(局部二值模式)特征提取原理
1.前言 LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子:它具有旋转不变性和灰度不变性等显著的优点.它是首先由T. Ojala, M.Pietik ...
- 局部二值模式LBP的详细理解
局部二值模式LBP的噶几详细的理解 一个电脑小白的自我成长之路,总是这么的寂寞.孤独.无聊,却充满新奇.艰难,唯有坚韧不拔,持续奋斗,才可披荆斩棘.登临云端.各位看官们:"咋的,能不能上干货 ...
- 局部二值模式(Local Binary Patterns)纹理灰度与旋转不变性
Multiresolution Gray Scale and Rotation Invariant Texture Classification with Local Binary Patterns, ...
- 计算机视觉基础-图像处理(图像分割/二值化)cpp+python
5.1 简介 该部分的学习内容是对经典的阈值分割算法进行回顾,图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技术.它特别适用 ...
- 计算机视觉基础-图像处理 Task05 图像分割/二值化
文章目录 OSTU二值化 自适应阈值 函数实现 OSTU二值化 自适应阈值 图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单.计算量小.性能较稳定而成为图像分割中最基本和应用最广泛的分割技 ...
- 【医学图像处理】9 二值形态学
形态学及二值操作 1 形态学相关概念 2 二值形态学操作 2.1 二值膨胀 2.2 二值腐蚀 2.3 二值开操作 2.4 二值闭操作 2.5 二值形态学总结 3 二值形态学应用 1 形态学相关概念 ...
- 特征提取算法——LBP(Local Binary Pattern)局部二值模式学习笔记
在上Computer Vision lecture的时候,讲师介绍了LBP算子,这里对他进行简单的介绍. LBP(Local Binary Pattern) 局部二制模式,是描述图像局部纹理特征的算子 ...
- 图像处理中的二值化和灰度化
图像的灰度化: 灰度是指只含亮度信息,不含色彩信息的图像.黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的.要表示灰度图,就需要把亮度值进行量化 使用灰度图的好处: ① RGB的值都一样. ② 图 ...
最新文章
- BP神经网络的线性本质的理解和剖析-卷积小白的随机世界
- java arraystoreexception_208道高频 Java面试题答案6
- MySQL中地理位置数据扩展geometry的使用心得
- .net连接mysql数据_.net连接MYSQL数据库 转载
- oracle数据提交不上去,oracle数据库命令窗口执行了语句但是没有提交会有什么影响吗...
- SAP FSM 学习笔记(一) : 使用API消费FSM的数据
- 前端攻略系列(二) - 前端各种面试题
- AE 新建项目(一)(持续更新,做到哪算哪)
- inner join 和join的区别_left join、right join和join ???
- 数博会重磅活动:第二届大数据科学与工程国际会议日程
- arcgis如何打开tif_实例|ArcGiS导出的dxf,在CASS中如何变身?
- 2021年中国电动辅助电动机市场趋势报告、技术动态创新及2027年市场预测
- 论文笔记_S2D.37_2015-TPAMI_使用深度卷积神经场从单目图像学习深度
- 华为官方解锁工具_渣男为何爱用华为手机?
- Module ‘/src/components/HelloWorld.vue“‘ has no default export.Vetur(1192)
- win10 磁盘管理 压缩卷 无法启动问题
- 登录界面---油管大佬
- android view.isshown,源码解析view的显示判断用isShown()还是View.VISIBLE
- 万物互联背景下的边缘计算安全需求与挑战
- 2015年ps计算机试题,2015年3月全国计算机一级考试ps模拟试题及答案(二).doc