图像处理基本方法-将BMP图片二值化-c语言调用opencv实现
opencv实现图片二值化,主要使用cvThreshold函数实现。
函数定义
void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
其中
src为原始图像数据。
dst为转换后图像数据。
threshold为转换阈值。超过多少为高,低于多少为低。
max_value为最大值的数值。
threshold_type为阈值类型。
具体函数调用
cvThreshold(testImage,testImageGray,thresholdLow,thresholdHigh,CV_THRESH_BINARY);
代码实现
/*******************************************************
* file:testOpenCvBinarization.c
* date:2021-06-26
* version:1.0.0.1
* author:jack8126
* description: bmp file, change to Binarization picture
*******************************************************/
#include <stdio.h>
#include "opencv2/opencv.hpp"
int main(int argc, char * * argv)
{
char u8PicNameRead[64] = {0};
char u8PicNameOut[64] = {0};
unsigned char thresholdLow = 0;
unsigned char thresholdHigh = 0;
int mode = 0;
if(argc < 6)
{
printf("please input like this:\r\n");
printf("./testOpenCvBinarization.bin test.bmp test-out.bmp 128 255 0 \r\n");
printf("test.bmp ---------------- input file \r\n");
printf("test-out.bmp ------------ output file \r\n");
printf("128 --------------------- threshold low \r\n");
printf("255 --------------------- threshold high \r\n");
printf("0 --------------------- mode 0, 1 \r\n");
return -1;
}
sprintf(u8PicNameRead,"%s",argv[1]);
sprintf(u8PicNameOut,"%s",argv[2]);
thresholdLow = atoi(argv[3]);
thresholdHigh = atoi(argv[4]);
mode = atoi(argv[5]);
printf("u8PicNameRead =%s\r\n",u8PicNameRead);
printf("thresholdLow =%d\r\n",thresholdLow);
printf("thresholdHigh =%d\r\n",thresholdHigh);
printf("mode =%d\r\n",mode);
// 1 CV_LOAD_IMAGE_GRAYSCALE
IplImage * testImage = cvLoadImage( ( const char*)u8PicNameRead, CV_LOAD_IMAGE_GRAYSCALE);
IplImage* testImageGray = cvCloneImage(testImage);
cvSetZero(testImageGray);
//cvCvtColor(testImage, testImageGray, CV_BGR2GRAY);
if(mode == 0)
{
cvThreshold(testImage,testImageGray,thresholdLow,thresholdHigh,CV_THRESH_BINARY);
}
else
{
cvThreshold(testImage,testImageGray,thresholdLow,thresholdHigh,CV_THRESH_BINARY_INV);
}
cvSaveImage(u8PicNameOut, testImageGray,0);
cvReleaseImage(&testImage);
cvReleaseImage(&testImageGray);
return 0;
}
makefile文件
#############################################################################
CROSS_COMPILE =
CC = $(CROSS_COMPILE)gcc -g
CPP = $(CROSS_COMPILE)g++
CXX = $(CROSS_COMPILE)g++
AR = $(CROSS_COMPILE)ar
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
RM = rm
MAKE = @make
MKDIR = mkdir -p
COPY = @copy
CD = @cd
ECHO = @echo
ZIP = @gzip
PWD_DIR := $(shell pwd)
#OPENCV_BASE_DIR := $(PWD_DIR)/../output/
OPENCV_BASE_DIR := /usr/local/
OPENCV_DIR := -I$(OPENCV_BASE_DIR)/include
OPENCV1_DIR := -I$(OPENCV_BASE_DIR)/include/opencv
OPENCV2_DIR := -I$(OPENCV_BASE_DIR)/include/opencv2
OPENCV_LIB_DIR := -L$(OPENCV_BASE_DIR)lib/
OPENCV_LIB_DIR2 := -L$(OPENCV_BASE_DIR)lib/
OPENCV_LIBS := $(OPENCV_LIB_DIR)libopencv_highgui.a\
$(OPENCV_LIB_DIR)libopencv_core.a\
$(OPENCV_LIB_DIR)libopencv_imgproc.a\
$(OPENCV_LIB_DIR)libopencv_objdetect.a
INC_FLAGS := $(OPENCV_DIR) $(OPENCV1_DIR) $(OPENCV2_DIR)
SRC := $(wildcard *.c)
OBJ := $(SRC:%.c=%.o)
#TARGET := $(OBJ:%.o=%)
TARGET := testOpenCvBinarization.bin
.PHONY : clean all
all : testBmpCv.bin
testBmpCv.bin:
$(CXX) testOpenCvBinarization.c $(INC_FLAGS) $(OPENCV_LIB_DIR2) -fPIC -lpthread -lz -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect -o $(TARGET) $(OBJS) $(LIBS)
clean:
rm -f $(OBJS) $(TARGET)
编译程序
编译命令如下
make
执行完上述命令之后,会生成testOpenCvBinarization.bin文件,后面执行程序时需要该文件。
执行程序
使用如下命令执行程序,可将bmp图片转换为灰度图片。
./testOpenCvBinarization.bin image.bmp image-out.bmp 120 255 0
./testOpenCvBinarization.bin image.bmp image-out-2.bmp 120 255 1
执行完上述命令后,生成image-out.bmp文件。
原图
二值化图片
二值化图片-2