<C++> 基于SSE实现图像二值化

news2024/11/26 23:19:15

基于SSE实现图像二值化

SSE介绍及使用可见:https://blog.csdn.net/thisiszdy/article/details/132512686
本文使用SSE指令集来实现图像二值化算法,同时对比OpenCV二值化算子及for循环求解二值化的效果及性能。

// opencvTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/core.hpp"
#include <emmintrin.h>
#include <opencv2/imgcodecs.hpp>

using namespace cv;
using namespace std;

int main()
{
	clock_t start, end;
	const char* imageName = "test.bmp";
	cv::Mat src = imread(imageName, IMREAD_GRAYSCALE);

	//OpenCV二值化
	start = clock();
	cv::Mat dst;
	cv::threshold(src, dst, 50, 255, cv::THRESH_BINARY);
	end = clock();
	double time_cost = (double)(end - start);
	std::cout << "OpenCV Threshold耗时:" << time_cost << std::endl;

	//for循环二值化
	start = clock();
	cv::Mat dstfor(src.rows, src.cols, CV_8UC1);
	uchar* ptrSrc = src.data;
	uchar* ptrdst = dstfor.data;
	int lenght = src.rows * src.cols * src.channels();
#pragma omp parallel
	for (int i = 0;i < lenght;i++)
	{
		if (*(ptrSrc + i) <= 50)
		{
			*(ptrdst + i) = 0;
		}
		else
		{
			*(ptrdst + i) = 255;
		}
	}
	end = clock();
	double time_cost1 = (double)(end - start);
	std::cout << "for Threshold耗时:" << time_cost1 << std::endl;

	//SSE加速二值化
	start = clock();
	uchar thre = 50;
	uchar maxV = 255;
	cv::Mat dts3(src.rows, src.cols, CV_8UC1);
	uchar* ptrSrc1 = src.ptr();
	uchar* ptrdst1 = dts3.data;
	size_t srcstep = src.step;
	__m128i smask = _mm_set1_epi8((char)128);
	__m128i mThre = _mm_set1_epi8(50);
#pragma omp parallel
	for (size_t i = 0; i < src.rows; i++, ptrSrc1 += srcstep, ptrdst1 += srcstep)
	{
		for (size_t j = 0; j <= src.cols * src.channels() - 16; j += 16)
		{
			__m128i mValue = _mm_loadu_si128((__m128i*)(ptrSrc1 + j)); //加载内存到寄存器
			auto sub1 = _mm_sub_epi8(mValue, smask); //无符号0~255范围转为有符号-128~127范围
			auto sub2 = _mm_sub_epi8(mThre, smask);
			mValue = _mm_cmpgt_epi8(sub1, sub2); //与阈值比较,大于阈值返回255,小于阈值返回0
			_mm_storeu_si128((__m128i*)(ptrdst1 + j), mValue); //寄存器加载到内存
		}
	}
	end = clock();
	double time_cost2 = (double)(end - start);
	std::cout << "SSE Threshold耗时:" << time_cost2 << std::endl;

	// 效果比较
	Mat findzero1 = dst != dstfor; //OpenCV和for循环比较效果
	Mat findzero2 = dst != dts3; //Opencv和SEE指针比较效果
	vector<cv::Point> veczero1;
	vector<cv::Point> veczero2;
	cv::findNonZero(findzero1, veczero1);
	cv::findNonZero(findzero2, veczero2);
	int num1 = veczero1.size();
	int num2 = veczero2.size();
	std::cout << "OpenCV和for循环两种方法逐像素比较,像素不同个数:" << num1 << std::endl;
	std::cout << "Opencv和SEE指针两种方法逐像素比较,像素不同个数:" << num2 << std::endl;

	system("pause");
	return 0;
}

运算结果显示,SSE指令集加速阈值分割更快,检测效果与OpenCV一致。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2011-2022年北大法宝省市县环保行政处罚数据

2011-2022年北大法宝省市县环保行政处罚数据 1、时间&#xff1a;2011-2022年 2、范围&#xff1a;全国各省份、各城市、各区县 3、来源&#xff1a;北大法宝 4、数据指标&#xff1a;地区代码、地区名称、地区等级、所属省份、所属城市、处罚年份、主题分类、案件数目 5、…

如何使用谷歌浏览器连接linux服务器SSH服务

环境&#xff1a; 谷歌浏览器 版本 116.0.5845.141&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; Win10 专业版 安全外壳 (SSH)v.0.58 问题描述&#xff1a; 如何使用谷歌浏览器连接linux服务器SSH服务 解决方案&#xff1a; 1.找了有台安装好了这个插…

数据结构——排序算法——堆排序

堆排序过程如下&#xff1a; 1.用数列构建出一个大顶堆&#xff0c;取出堆顶的数字&#xff1b; 2.调整剩余的数字&#xff0c;构建出新的大顶堆&#xff0c;再次取出堆顶的数字&#xff1b; 3.循环往复&#xff0c;完成整个排序。 构建大顶堆有两种方式&#xff1a; 1.从 0 开…

2023更新:多功能短视频去水印工具微信小程序源码,带流量主功能(教程含源码)

简介&#xff1a; 这是一个自带去水印接口的多功能小程序&#xff0c;支持各大平台短视频去水印&#xff0c;保存封面、图集、标题等等&#xff0c;还可以本地图片去水印&#xff0c;图片拼接&#xff0c;九宫格切图&#xff0c;修改视频的MD5等等。当然&#xff0c;也支持流量…

LeetCode算法心得——和为k的子数组(前缀和+HashMap)

大家好&#xff0c;我是晴天学长&#xff0c;这是一个很重要的前缀和hash运用的题&#xff0c;为后面很多的题打基础&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。 1) .和为k的子数组 2) .算法思路 和为k的子数组 1.首先是前缀和 2.根据关系 s【…

Ceph入门到精通-S3 基准测试工具warp使用入门

S3 基准测试工具。 下载 下载适用于各种平台的二进制版本。 配置 可以使用命令行参数或环境变量配置 Warp。 可以使用 、 在命令行上指定要使用的 S3 服务器&#xff0c;也可以选择指定 TLS 和自定义区域。--host--access-key--secret-key--tls--region 也可以使用 、、 和…

22.Xaml TabControl 控件--->选项卡控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

计算机组成原理--数据表示

目录 1、机器数及特点 1.1 机器内的数据表示 1.1.1.原码 1.1.2. 反码 1.1.3. 补码 1.2 常见机器数的特点 2、定点数与浮点数据表示 2.1 定点数据表示 2.2 浮点数据表示 2.3 补充&#xff1a;小数的二进制表示 3、数据校验的基本原理 3.1 必要性&#xff1a; 3.2 基…

编程小白的自学笔记十四(python办公自动化创建、复制、移动文件和文件夹)

系列文章目录 编程小白的自学笔记十三&#xff08;python办公自动化读写文件&#xff09; 编程小白的自学笔记十二&#xff08;python爬虫入门四Selenium的使用实例二&#xff09; 编程小白的自学笔记十一&#xff08;python爬虫入门三Selenium的使用实例详解&#xff09; …

X86_64函数调用汇编程序分(2)

X86_64函数调用汇编程序分&#xff08;2&#xff09; 1 X86_64寄存器使用标准2 leaveq和retq指令2.1 leaveq2.2 retq 3 执行leaveq和retq之后栈的结构3.1 执行leaveq之后栈的结构3.1.1 test_fun_b函数执行leaveq之前的栈结构示意图3.1.2 test_fun_b函数执行leaveq之后的栈结构示…

MySQL使用Xtrabackup备份到AWS存储桶

1.安装Xtrabackup cd /tmp wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86…

Markdown 字体变红色,2种办法

老读者都知道王哥是 10 年 markdown 专家&#xff0c;今天教大家如何搞定字体颜色通用技巧 文章目录 方案一效果 方案二效果 颜色参考表 方案一 HEML 代码&#xff1a; <font colorred> 学技术&#xff0c;到 JavaPub </font>或者 <font colorFF0000> 学技术…

OpenCV之图片修复(inpaint)

图片修复基本原理&#xff1a; 我们自己标定噪声的特征&#xff0c;然后根据噪声周围区域的颜色特征修复噪声所在的区域。通俗一点就是用邻近的像素替换那些坏标记&#xff0c;使其看起来像是邻居。 如下图&#xff0c;需要将白色框框去掉&#xff1a; 标定噪声特征 先分析白…

记一次在amd架构打包arm64架构的镜像的试错经历

前提 在amd架构打包了一个镜像&#xff0c;放在arm64架构服务器上可以load ,但是run的时候报平台不兼容的问题。 运行如下命令查看发现 架构属于 amd64 如下&#xff1a; docker inspect 镜像ID需要生成一个arm的镜像才能运行。 尝试 首先Dockerfile 的FROM 基础镜像就的是…

uniapp 接入微信小程序隐私政策兼容

自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则后&#xff0c;方可调用微信提供的隐私接口。 相关公告见&#xff1a;关于小程序隐私保…

Sharding-JDBC分库分表-分布式事务-5

分布式事务 Sharding JDBC事务介绍 分库分表必然会涉及到分布式事务的问题&#xff0c;关于这方面&#xff0c;sharding JDBC为用户提供了两种分布式事务解决方案&#xff1a;XA事务和BASE事务&#xff0c;这两个的区别是&#xff1a;XA事务&#xff0c;追求强一致性&#xf…

udev自动创建设备节点的机制

流程框图如下 自动创建 1 内核检测到设备插入后&#xff0c;会发送一个uevent事件到内核中&#xff0c;并提供有关硬件设备的信息。 2 udevd守护程序收到uevent事件后&#xff0c;创建一个设备类&#xff0c;&#xff08;向上提交目录信息&#xff09;&#xff0c;会在内核中…

道路交通资产管理体系实施指南

声明 本文是学习GB-T 42932-2023 道路交通资产管理体系实施指南. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 7 支持 7.1 资源 组织宜确定并提供建立、实施、保持和持续改进资产管理体系所需的资源&#xff0c;包括人力、财力、物质、技 术、知…

Java8实战-总结26

Java8实战-总结26 用流收集数据分组多级分组按子组收集数据 用流收集数据 分组 一个常见的数据库操作是根据一个或多个属性对集合中的项目进行分组。就像前面讲到按货币对交易进行分组的例子一样&#xff0c;如果用指令式风格来实现的话&#xff0c;这个操作可能会很麻烦、啰…

ABB PP846 3BSE042238R1触摸屏模块

ABB PP846 3BSE042238R1是一款触摸屏模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;以提供人机界面&#xff08;HMI&#xff09;功能&#xff0c;允许操作员与控制系统进行交互和监控。以下是一些可能的产品功能和功能&#xff0c;但请注意&#xff0c;具体的功能…