Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .coveragerc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

[run]
source = color_correction_asdfghjkl
source = color_correction
omit =
tests/*

Expand Down
19 changes: 9 additions & 10 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Publish Python Package to PyPI
name: 📦 Publish Python Package to PyPI

on:
push:
Expand All @@ -9,26 +9,25 @@ jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Clone repository
- name: 📥 Checkout repository
uses: actions/checkout@v4
- name: Install uv and set the python version

- name: 🐍 Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
version: "0.5.23"
enable-cache: true
cache-dependency-glob: "uv.lock"
python-version: 3.12

- name: Extract version from Git tag
- name: 🏷️ Extract version from Git tag
id: get_version
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Clear directory

- name: 🧹 Clear directory
run: rm -rf dist

- name: Build package
- name: 🔨 Build package
run: uv build

- name: Publish to PyPI
- name: 🚀 Publish to PyPI
run: uv publish --token ${{ secrets.PYPI_API_TOKEN }}
26 changes: 17 additions & 9 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,20 @@
name: Test
name: 🧪 Test

on:
pull_request:
branches: [ main ]
paths-ignore:
- '**.md'
- 'docs/**'
- 'LICENSE'
- '.gitignore'
- '.pre-commit-config.yaml'
- 'mkdocs.yml'
- 'docs_requirements.txt'

jobs:
test:
name: Test
name: 🧪 Test
runs-on: ${{ matrix.os }}
strategy:
matrix:
Expand All @@ -17,23 +25,23 @@ jobs:
- "3.12"

steps:
- uses: actions/checkout@v4
- name: 📥 Checkout repository
uses: actions/checkout@v4

- name: Install uv and set the python version
- name: 🐍 Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
version: "0.5.24"
enable-cache: true
cache-dependency-glob: "uv.lock"
python-version: ${{ matrix.python-version }}

- name: Install the project
- name: 📦 Install the project
run: uv sync --all-groups --no-group dev-model

- name: Checking linter and formatting
- name: 🔍 Checking linter and formatting
run: uvx ruff check

- name: Run tests with Coverage
- name: 📊 Run tests with Coverage
run: |
uv run pytest --cov-report=term-missing --cov=color_correction_asdfghjkl tests/
uv run pytest --cov-report=term-missing --cov=color_correction tests/
uv run coverage report --fail-under=35
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,4 @@ wheels/

tmp/
zzz/
color_correction_asdfghjkl/asset/images/
color_correction/asset/images/
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
yolo-export-onnx:
yolo export \
model=color_correction_asdfghjkl/asset/.model/yv8-det.pt \
model=color_correction/asset/.model/yv8-det.pt \
format=onnx \
device=mps \
simplify=True \
Expand Down
78 changes: 50 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@

# 🎨 Color Correction
<div align="center">

> **Note:** The "asdfghjkl" is just a placeholder due to some naming difficulties.
# Color Correction

<br>

[![version](https://badge.fury.io/py/color-correction.svg)](https://badge.fury.io/py/color-correction)
[![downloads](https://img.shields.io/pypi/dm/color-correction)](https://pypistats.org/packages/color-correction)
[![python-version](https://img.shields.io/pypi/pyversions/color-correction)](https://badge.fury.io/py/color-correction)

</div>

> _Package formerly published as [`color-correction-asdfghjkl`](https://pypi.org/project/color-correction-asdfghjkl/) on PyPI. The name has been simplified for better accessibility and professional recognition._

This package is designed to perform color correction on images using the Color Checker Classic 24 Patch card. It provides a robust solution for ensuring accurate color representation in your images.

## 📦 Installation

```bash
pip install color-correction-asdfghjkl
pip install color-correction
```

## 🏋️‍♀️ How it works
Expand All @@ -18,6 +28,8 @@ pip install color-correction-asdfghjkl
## ⚡ How to use

```python
from color_correction import ColorCorrection

# Step 1: Define the path to the input image
image_path = "asset/images/cc-19.png"

Expand Down Expand Up @@ -49,31 +61,40 @@ corrected_image = color_corrector.predict(
eval_result = color_corrector.calc_color_diff_patches()
print(eval_result)
```
- Output evaluation result:
```json
{
"initial": {
"min": 2.254003059526461,
"max": 13.461066402633447,
"mean": 8.3072755187654,
"std": 3.123962754767539,
},
"corrected": {
"min": 0.30910031798755183,
"max": 5.422311999126372,
"mean": 1.4965478752947827,
"std": 1.2915738724958112,
},
"delta": {
"min": 1.9449027415389093,
"max": 8.038754403507074,
"mean": 6.810727643470616,
"std": 1.8323888822717276,
},
}
```
- Sample output debug image (polynomial degree=2):
![Sample Output](assets/sample-output-debug.jpg)

<details>
<summary>Sample Evaluation Output</summary>

```json
{
"initial": {
"min": 2.254003059526461,
"max": 13.461066402633447,
"mean": 8.3072755187654,
"std": 3.123962754767539,
},
"corrected": {
"min": 0.30910031798755183,
"max": 5.422311999126372,
"mean": 1.4965478752947827,
"std": 1.2915738724958112,
},
"delta": {
"min": 1.9449027415389093,
"max": 8.038754403507074,
"mean": 6.810727643470616,
"std": 1.8323888822717276,
},
}
```
</details>

<details>
<summary>Sample Output Debug Image</summary>

![Sample Output](assets/sample-output-debug.jpg)

</details>

## 📈 Benefits
- **Consistency**: Ensure uniform color correction across multiple images.
Expand All @@ -89,6 +110,7 @@ print(eval_result)
- [ ] Add more analysis and evaluation metrics (Still thinking...)

<!-- write reference -->

## 📚 References
- [Color Checker Classic 24 Patch Card](https://www.xrite.com/categories/calibration-profiling/colorchecker-classic)
- [Color Correction Tool ML](https://github.com/collinswakholi/ML_ColorCorrection_tool/tree/Pip_package)
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import numpy as np

from color_correction_asdfghjkl.schemas.det_yv8 import DetectionResult
from color_correction.schemas.det_yv8 import DetectionResult


class BaseCardDetector(ABC):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import numpy as np
import onnxruntime

from color_correction_asdfghjkl.core.card_detection.base import BaseCardDetector
from color_correction_asdfghjkl.schemas.det_yv8 import DetectionResult
from color_correction_asdfghjkl.utils.downloader import downloader_model_yolov8
from color_correction_asdfghjkl.utils.yolo_utils import (
from color_correction.core.card_detection.base import BaseCardDetector
from color_correction.schemas.det_yv8 import DetectionResult
from color_correction.utils.downloader import downloader_model_yolov8
from color_correction.utils.yolo_utils import (
multiclass_nms,
xywh2xyxy,
)
Expand Down Expand Up @@ -180,9 +180,9 @@ def __get_output_details(self) -> None:

if __name__ == "__main__":
print("YOLOv8CardDetector")
model_path = "color_correction_asdfghjkl/asset/.model/yv8-det.onnx"
image_path = "color_correction_asdfghjkl/asset/images/cc-1.jpg"
image_path = "color_correction_asdfghjkl/asset/images/Test 19.png"
model_path = "color_correction/asset/.model/yv8-det.onnx"
image_path = "color_correction/asset/images/cc-1.jpg"
image_path = "color_correction/asset/images/Test 19.png"
detector = YOLOv8CardDetector(conf_th=0.15, iou_th=0.7, use_gpu=True)

input_image = cv2.imread(image_path)
Expand Down
17 changes: 17 additions & 0 deletions color_correction/core/correction/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from color_correction.core.correction._factory import (
CorrectionModelFactory,
)
from color_correction.core.correction.affine_reg import AffineReg
from color_correction.core.correction.least_squares import (
LeastSquaresRegression,
)
from color_correction.core.correction.linear_reg import LinearReg
from color_correction.core.correction.polynomial import Polynomial

__all__ = [
"CorrectionModelFactory",
"LeastSquaresRegression",
"Polynomial",
"LinearReg",
"AffineReg",
]
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from color_correction_asdfghjkl.core.correction.affine_reg import AffineReg
from color_correction_asdfghjkl.core.correction.least_squares import (
from color_correction.core.correction.affine_reg import AffineReg
from color_correction.core.correction.least_squares import (
LeastSquaresRegression,
)
from color_correction_asdfghjkl.core.correction.linear_reg import LinearReg
from color_correction_asdfghjkl.core.correction.polynomial import Polynomial
from color_correction.core.correction.linear_reg import LinearReg
from color_correction.core.correction.polynomial import Polynomial


class CorrectionModelFactory:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import numpy as np
from sklearn.linear_model import LinearRegression

from color_correction_asdfghjkl.core.correction.base import BaseComputeCorrection
from color_correction_asdfghjkl.utils.correction import (
from color_correction.core.correction.base import BaseComputeCorrection
from color_correction.utils.correction import (
postprocessing_compute,
preprocessing_compute,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

import numpy as np

from color_correction_asdfghjkl.core.correction.base import BaseComputeCorrection
from color_correction_asdfghjkl.utils.correction import (
from color_correction.core.correction.base import BaseComputeCorrection
from color_correction.utils.correction import (
postprocessing_compute,
preprocessing_compute,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import numpy as np
from sklearn.linear_model import LinearRegression

from color_correction_asdfghjkl.core.correction.base import BaseComputeCorrection
from color_correction_asdfghjkl.utils.correction import (
from color_correction.core.correction.base import BaseComputeCorrection
from color_correction.utils.correction import (
postprocessing_compute,
preprocessing_compute,
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import PolynomialFeatures

from color_correction_asdfghjkl.core.correction.base import BaseComputeCorrection
from color_correction_asdfghjkl.utils.correction import (
from color_correction.core.correction.base import BaseComputeCorrection
from color_correction.utils.correction import (
postprocessing_compute,
preprocessing_compute,
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import cv2
import numpy as np

from color_correction_asdfghjkl.schemas.det_yv8 import DetectionResult
from color_correction_asdfghjkl.utils.geometry_processing import (
from color_correction.schemas.det_yv8 import DetectionResult
from color_correction.utils.geometry_processing import (
extract_intersecting_patches,
generate_expected_patches,
suggest_missing_patch_coordinates,
)
from color_correction_asdfghjkl.utils.image_processing import (
from color_correction.utils.image_processing import (
calc_mean_color_patch,
crop_region_with_margin,
)
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import numpy as np
from pydantic import BaseModel

from color_correction_asdfghjkl.utils.yolo_utils import draw_detections
from color_correction.utils.yolo_utils import draw_detections

BoundingBox = tuple[int, int, int, int]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
import numpy as np
from numpy.typing import NDArray

from color_correction_asdfghjkl.constant.color_checker import reference_color_d50_bgr
from color_correction_asdfghjkl.core.card_detection.det_yv8_onnx import (
from color_correction.constant.color_checker import reference_color_d50_bgr
from color_correction.core.card_detection.det_yv8_onnx import (
YOLOv8CardDetector,
)
from color_correction_asdfghjkl.core.correction import CorrectionModelFactory
from color_correction_asdfghjkl.processor.det_yv8 import DetectionProcessor
from color_correction_asdfghjkl.utils.image_patch import (
from color_correction.core.correction import CorrectionModelFactory
from color_correction.processor.det_yv8 import DetectionProcessor
from color_correction.utils.image_patch import (
create_patch_tiled_image,
visualize_patch_comparison,
)
from color_correction_asdfghjkl.utils.image_processing import calc_color_diff
from color_correction_asdfghjkl.utils.visualization_utils import (
from color_correction.utils.image_processing import calc_color_diff
from color_correction.utils.visualization_utils import (
create_image_grid_visualization,
)

Expand Down
Empty file.
Loading