- [ ] XOR
* 假設有一張黑白的相片是由很多個0 ~255 的 pixel 組成 (0 是黑色,255 是白色),這時候可以用任意的 KEY (00000000~2~ - 11111111~2~) 跟原本的每個 pixel 做運算,如果使用 AND (每個 bit 有 75% 機率會變成 `0`),所以圖會變暗。如果使用 OR (每個 bit 有 75% 機率會變 `1`),圖就會變亮。這兩種幾乎都還是看的出原本的圖片,但若是用 XOR 的話,每個 bit 變成 0 或 1 的機率都是 50%,所以圖片就會變成看不出東西的雜訊。

上圖左 1 是原圖,左 2 是用 AND 做運算之後,右 2 是用 OR 做運算之後,右 1 是用 XOR,可見使用 XOR 的加密效果最好。
上面敘述出自:[你所不知道的 C 語言:數值系統](https://hackmd.io/@sysprog/c-numerics)
### 在這裡做些個人的紀錄
由於上面敘述會令人誤會,該KEY並非單一固定數值,而是以mask的方法運算,需注意及附上程式碼,其結果正如上圖。
```python=
import cv2
import numpy as np
import matplotlib.pyplot as plt
def apply_operation(image, operation):
# Generate a random mask based on probabilities
if operation == "and":
mask = np.random.randint(0, 256, size=image.shape) # 75% zeros
result = image & mask
elif operation == "or":
mask = np.random.randint(0, 256, size=image.shape) # 75% ones
result = image | mask
elif operation == "xor":
mask = np.random.randint(0, 256, size=image.shape) # 50% 0s and 1s
result = image ^ mask
else:
return None
return result
# Load image in grayscale
image_path = "/content/head.jpg"
original_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# Apply operations
and_image = apply_operation(original_image, "and")
or_image = apply_operation(original_image, "or")
xor_image = apply_operation(original_image, "xor")
# Display results
plt.figure(figsize=(15, 5))
plt.subplot(1, 4, 1)
plt.imshow(original_image, cmap='gray')
plt.title("Original Image")
plt.subplot(1, 4, 2)
plt.imshow(and_image, cmap='gray')
plt.title("AND Operation")
plt.subplot(1, 4, 3)
plt.imshow(or_image, cmap='gray')
plt.title("OR Operation")
plt.subplot(1, 4, 4)
plt.imshow(xor_image, cmap='gray')
plt.title("XOR Operation")
plt.tight_layout()
plt.show()
```