如何在OpenCV Java中将BGR图像矩阵转换为RGB?
Python到Java的OpenCV BGR转RGB+格式转换实现
先拆解你给出的Python代码的核心逻辑:
cv2.imread("image.jpg"):读取得到BGR格式的HWC(高、宽、通道)矩阵im.transpose((2, 0, 1))[::-1]:完成两个关键操作:- 通道反转:将BGR转为RGB
- 维度重排:从HWC(高、宽、通道)转为CHW(通道、高、宽)
你的Java代码存在两个问题:
- 颜色转换方向错误:应该用
COLOR_BGR2RGB而非COLOR_RGB2BGR - 未处理HWC到CHW的维度转换,这是Python代码里
transpose的核心作用
正确实现代码
1. 仅完成BGR转RGB(保留HWC格式)
如果不需要CHW格式,只纠正颜色通道顺序,用以下代码即可:
Mat image = Imgcodecs.imread("image.jpg"); // 读取为BGR格式HWC矩阵 Mat rgbImage = new Mat(); Imgproc.cvtColor(image, rgbImage, Imgproc.COLOR_BGR2RGB); // BGR转RGB,输出仍为HWC
2. 完整实现BGR转RGB+HWC转CHW
如果需要和Python代码完全一致的CHW格式结果,需手动处理维度重排:
// 1. 读取并转RGB Mat image = Imgcodecs.imread("image.jpg"); Mat rgbImage = new Mat(); Imgproc.cvtColor(image, rgbImage, Imgproc.COLOR_BGR2RGB); // 2. 拆分RGB通道 List<Mat> channels = new ArrayList<>(); Core.split(rgbImage, channels); // 3. 提取各通道数据 int channelSize = (int)(channels.get(0).total() * channels.get(0).elemSize()); byte[] rData = new byte[channelSize]; byte[] gData = new byte[channelSize]; byte[] bData = new byte[channelSize]; channels.get(0).get(0, 0, rData); channels.get(1).get(0, 0, gData); channels.get(2).get(0, 0, bData); // 4. 拼接为CHW格式字节数组(R全量 → G全量 → B全量) byte[] chwData = new byte[channelSize * 3]; System.arraycopy(rData, 0, chwData, 0, channelSize); System.arraycopy(gData, 0, chwData, channelSize, channelSize); System.arraycopy(bData, 0, chwData, channelSize * 2, channelSize); // 5. 创建CHW格式Mat Mat chwImage = new Mat(new Size(rgbImage.rows(), rgbImage.cols()), CvType.CV_8UC3); chwImage.put(0, 0, chwData);
说明
- 若仅需颜色纠正,执行第一步即可,对应Python中
im[..., ::-1]的效果 - 若需适配深度学习框架等CHW格式需求,执行完整流程即可匹配Python代码的输出
内容的提问来源于stack exchange,提问作者BayanR
相关产品推荐
相关产品推荐

