floodfill算法 java_OpenCV 3 floodFill(漫水填充)、图片的放大缩小 pyrUp、pyrDown、Resize JAVA OpenCV专题学习10...

关于 JAVA 学习 OpenCV 的内容,函数讲解。内容我均整理在 GitHubd的【OpenCV3-Study-JAVA】

下面代码中所需的项目结构,图片,请访问 GitHub 获取。

内容在注释里了。

package opencv.study;

import com.liuqi.opencv.base.OpenCVProcessBase;

import org.junit.Test;

import org.opencv.core.*;

import org.opencv.imgcodecs.Imgcodecs;

import org.opencv.imgproc.Imgproc;

/**

* @Author : alexliu

* @Description : 主要学习

* 1. floodFill 漫水|水漫填充

* 2. pyrUp 向上采样

* 3. pyrDown 向下采样

* 4. resize 放大缩小

*/

public class StudySection_10 extends OpenCVProcessBase {

private String save_dir = "study-output/study-opencv-10";

/**--------------------*

* 第一节 floodFill

**--------------------*/

/**

* 漫水填充

*

* 又叫水漫填充,用特定的颜色填充连通区域,常用来标记或分离图像的一部分。

* 漫水填充,将种子点颜色相近的区域进行连通,类似 photoshop 的魔术棒工具。

*/

@Test

public void testFloodFill(){

/*

* 官方说明 : https://docs.opencv.org/3.0-beta/modules/imgproc/doc/miscellaneous_transformations.html#floodfill

*

* 原型方法 :

* floodFill(Mat image, Mat mask, Point seedPoint, Scalar newVal) 这个原型方法,用参数测试了下,没效果。不知道原因。

* floodFill(Mat image, Mat mask, Point seedPoint, Scalar newVal, Rect rect, Scalar loDiff, Scalar upDiff, int flags)

*

* 参数 :

* image : Mat 输入图像 输入/输出图像,1通道或3通道,8位图像

* mask : Mat 操作掩膜,单通道,8位,比image 长宽都大2个像素的图像。

* seedPoint : Point ,起始点,漫水填充的种子点

* newVal : Scalar ,像素点被染色的值,即通过起始点漫水填充后的区域填充的颜色

* rect : Rect ,不传的话,默认为0。设置漫水填充的最小区域。如果设置了,而漫水填充找出的区域 < rect 那么不会填充。

* loDiff : Scalar ,在当前观察到的像素和它的一个相邻的像素点之间的最大亮度/颜色的负差 最大值。

* upDiff : Scalar ,在当前观察到的像素和它的一个相邻的像素点之间的最大亮度/颜色的正差 最大值。

* flags : int ,操作标识符。参看下面示例

*

* 一般不需要borderType,borderValue,均有默认值。如果需要使用,可参考官网获取更多信息

*/

Mat src = Imgcodecs.imread(this.p_test_file_path + "/caoyuan.jpg");

// mask 单通道,8位图,比原始图片宽高多2像素

Mat mask = new Mat(src.height()+2,src.width()+2 , CvType.CV_8UC1);

Point seedPonit = new Point(30,35);

Scalar loDiff = new Scalar(20,20,20); //没怎么明白,建议要了解的看下官方说明

Scalar upDiff = new Scalar(20,20,20); //没怎么明白,建议要了解的看下官方说明

/*

* flags 此参数参看示例设置

*

* 分别分为3个部分,低、高、中,参数之间用为运算符号 "|" (按位或)链接

*

* 1. 低八位

* -- 可选值: 4 、8 ,2个选项。

* -- 4 只计算水平、垂直方向,8 多了个对角线方向

* 2. 高八位

* -- 可选值 ,0 或 FLOODFILL_MASK_ONLY 、 FLOODFILL_FIXED_RANGE,除0外,2个常量可以组合或单独使用

* -- FLOODFILL_MASK_ONLY 不会填充原始图,只填充 mask 。 即 newVal 参数会失效

* -- FLOODFILL_FIXED_RANGE 设置后:会考虑当前像素与种子像素之间的色差,不设置:会考虑当前像素与邻近像素之间的差。

* 3. 中八位

* -- 当高八位设置成 FLOODFILL_MASK_ONLY 时,由于不填充 src,填充 mask,而 mask 为单通道,newVal 为 RGB,所以不适用,导致 newVal 失效。

* 这里就给一个值,用于填充 mask 。

* -- 如果为 0 ,则 mask 会用1来填充

* -- 注意,非0 的情况,中八位的值要填充高八位,需要向左位移8位。如填充 值为38 ,38二进制位 100110 , 向左位移8位 10011000000000

*/

int flags = 8 | Imgproc.FLOODFILL_MASK_ONLY | Imgproc.FLOODFILL_FIXED_RANGE | (38<<8);

// flags 计算规则(位运算)

// 原始数字 二进制

// 8 = 1000

// Imgproc.FLOODFILL_MASK_ONLY = 131072 = 100000000000000000

// Imgproc.FLOODFILL_FIXED_RANGE = 65536 = 10000000000000000

// 38<<8 = 100110 << 8 = 10011000000000

//

// 按位或("|")计算: 110010011000001000

Rect rect = new Rect(2,2,1,1);

Scalar newVal = new Scalar(0,0,255);

//这个原型方法,用参数测试了下,没效果。不知道原因。

//Imgproc.floodFill(src,mask,seedPonit,newVal);

Imgproc.floodFill(src,mask,seedPonit,newVal,rect,loDiff,upDiff,flags);

this.saveImage(this.save_dir + "/image_process_floodfill_src.png",src);

this.saveImage(this.save_dir + "/image_process_floodfill_mask.png",mask);

}

/**--------------------*

* 第二节 pyrUp、pyrDown

**--------------------*/

/*

* 在学习 pyrUp、pyrDown 之前先了解下图像金字塔

*

* 图像金字塔:

* 图像金字塔是图像中多尺度表达图像的一种,最主要的用途是图像的分割。用分辨率来解释图片的的简单结构。

* 比如,同一张图片:原始为 1024x768 ,改变下: (1024x0.9)x(768x0.9)=922x691 依次类推.... 分辨率 越低,则图像越小。

* 用金字塔来比喻图像分辨率,会以梯度往下采集图像,直至达到结束条件:

*

* 图像金字塔示例:

* 金字塔的底层为原始图像分辨率,金字塔层级越高分辨率越低。

*

* 3 缩小 --------- ...

* 2 缩小 --------- 830x622

* 1 缩小 --------- 922x691

* 0 原始 --------- 1024 x 768

*

* 在金字塔中层级方向是: 【上】 0,1,2,3.....x 【下】

* -- pyrDown 向下采样,可以理解为缩小

* -- pyrUp 向上采样,可以理解为放大

*

* 注意:pyrDown、pyrUp 不是互逆的。 既 原始图通过pyrDown 缩小后,再通过 pyrUp放大后的图像像素与原始图像像素是不一样的。

*

* -- pyrUp 放大,对原始图像扩大,在新增的行、列像素中,根据周围的像素去估计可能"丢失"的像素

*/

/**

* 图像向上采样

*/

@Test

public void testPyrUp(){

/*

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值